2013-10-24 52 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() 
}