【问题标题】:How to implement persisting related (cascading) objects via JDBC如何通过 JDBC 实现持久化相关(级联)对象
【发布时间】:2013-10-24 16:38:20
【问题描述】:

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

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

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

【问题讨论】:

  • 你尝试了什么?通常,您只需遍历您的 Collections 并通过您自己实现的 JDBC 方法保存它们。 (例如在您的数据访问对象中)
  • 什么数据库?你可以使用spring,还是必须只使用纯JDBC?

标签: java jpa jdbc


【解决方案1】:

假设您在组织和活动之间有外键关系,则必须先创建父行,然后再创建具有父 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()
}

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2017-12-29
    • 2020-02-11
    相关资源
    最近更新 更多