我有由父实体组成的相关对象,例如 Organisation.java,它具有对象类型的子属性作为 @OneToMany 列表,如活动(即 List activitiyList)(Activiy.java 具有自己的对象类型属性。
使用 JPA 持久性在数据库上对这些对象进行 CRUD 操作非常容易,但是我目前的要求禁止我使用 JPA,并且只使用 JDBC 来实现相同的功能——我不确定如何实现。
当第一次创建父对象和子对象(即所有对象都具有空 ID)时,如何通过 JDBC 实现相同的功能?
假设您在组织和活动之间有外键关系,您必须先创建父行,然后再创建具有父 ID 的子行。
你可以用 spring 来做到这一点,这是一个旧帖子,但原则保持不变。
要手动实现,您的数据库必须提供一种机制,通过该机制为给定表生成主键,而不必先创建行。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()
}