2013-10-24 54 views
0

有由父实体,如Organisation.java的相关对象已经对象类型的子节点属性类的活动(即列表activitiyList)作为@OneToMany列表(Activiy.java有。自己的类型对象的属性如何实现持续性关联(级联)通过JDBC对象

这是非常容易使用JPA持续性做一个数据库,对这些对象的CRUD操作,但我现在要求禁止我使用JPA,并且仅使用-JDBC实现相同的功能 - 我不知道如何实现

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

+0

那你试试?通常你只需遍历你的'Collection's并通过你自己实现的JDBC-方法来保存它们。 (例如在您的数据访问对象中) – Zhedar

+0

什么数据库?你可以使用spring,还是只使用纯JDBC? – raffian

回答

1

假设组织和活动之间有外键关系,则必须先创建父项,然后使用父级ID创建子行。

你可以用弹簧,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() 
}