如何通过JDBC实现持久的相关(级联)对象

时间:2013-10-24 16:38:21

标签: java jpa jdbc

我有相关的对象,包括父类实体,例如Organisation.java,它具有对象类型的子属性,如@OneToMany列表,如活动(即List activitiyList)(Activiy.java有自己的对象类型属性。

使用JPA持久性很容易在数据库上对这些对象进行CRUD操作,但我目前的要求是禁止使用JPA,并且仅使用JDBC实现相同的功能 - 我不知道如何实行。

如果首次创建父对象和子对象(即所有对象都具有空ID),如何通过JDBC实现相同的功能?

1 个答案:

答案 0 :(得分:1)

假设您在Organization和Activity之间有外键关系,则必须首先创建父项,然后创建父ID的子行。

你可以用spring,here's一个旧帖子来做这件事,但是校长保持不变。

要手动实现,您的数据库必须提供一种机制,通过该机制可以为给定表生成主键,而无需先创建行。 Oracle支持sequence.nextVal,因此您的数据库应该支持类似的东西。

我是伪编码的,你可以填空:

try{
   connection.setAutoCommit(false)

   //get organisation id first
   String nextOrgIdSql = "select orgSeq.nextval from someVirtualTable" //depends on database
   ResultSet orgIdRs = statement.executeQuery( nextOrgIdSql)
   int orgId = -1
   if( orgIdRs.next())    
      orgId = orgIdRs.getInt(1)

   //create organisation first
   String orgSql = 
      "Insert into ORGANISATION (ORGID, ...) values ("+ orgId + ",...)"

   //create activities
   for( Activity activity : organisation.getActivityList()){
      String nextActvIdSql = "select activitySeq.nextval from someVirtualTable"
      ResultSet actvIdRs = statement.executeQuery( nextActvIdSql)
      int actvId = -1
      if( actIdRs.next())    
         actvId = actvIdRs.getInt(1)

      statement.execute(
        "Insert INTO ACTIVITY (ACTVID, ORGID) values ("+actvId+","+orgId+")"
   }

   connection.commit()

}catch(SQLException e){
  connection.rollback()
}