2016-09-28 81 views
0

我從我的SpringBoot JPA Hibernate使用entity.merge持久化Oracle數據庫中的主鍵是序列生成的某些數據。 但合併後,我無法獲得插入到Oracle表中的主鍵。對於這兩種情況下,它返回0我如何獲得主鍵之後entity.merge

LOG.info("Inside InsertParts>>>>Before Merge Component-serialized_id>>>>" +webCrtPart.getSerializedComponentId()+ ">>>CSI>>" +webCrtPart.getCsInvSerialNumber()); 
    // Persist entity to database 
    mergeEntity(webCrtPart); 

    i++; 
    // checking the batchsize so after every batch of batchsize , it 
    // gets inserted to database 
    if (i % batchSize == 0) { 
     // Flush a batch of inserts and release memory. 
     entityManager.flush(); 
     entityManager.clear(); 
    } 

    LOG.info("Inside InsertParts>>>>After merge Component-serialized_id>>>>"+webCrtPart.getSerializedComponentId()); 
} 

return webCrtPartList; 

}


我的實體類的樣子:

@Table(name = "WEBCRT_CMPNT_SRLZD") 
@Entity 
public class WebCrtSerializedComponent { 

    @Id 
    @SequenceGenerator(name="component_seq", sequenceName="WEBCRT_CMPNT_SRLZD_SEQ" , allocationSize=1) 
    @GeneratedValue(generator = "component_seq", strategy = GenerationType.SEQUENCE) 
    @Column(name = "CMPNT_SRLZD_SEQ_ID") 
    private Long serializedComponentId; 

    @Column(name = "ITM") 
    private String item; 

    @Column(name = "SUB_CMPNT_SEQ_ID") 
    private String subComponentSeqId; 

    @Column(name = "PRT_NUM") 
    private String partNumber; 

    @Column(name = "INCMNG_SRL_NUM") 
    private String incomingSerialNumber; 

    @Column(name = "NUM_OF_PREV_RPRS") 
    private String previousRepairCount; 

請找到以下日誌:

2016-09-28 15:42:19.861[0;39m [32m INFO[0;39m [35m63710[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.web.servlet.DispatcherServlet  [0;39m [2m:[0;39m FrameworkServlet 'dispatcherServlet': initialization completed in 25 ms 
[2m2016-09-28 15:42:19.934[0;39m [32m INFO[0;39m [35m63710[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mc.g.p.b.m.impl.JobRetrievalManager  [0;39m [2m:[0;39m parameters to be passed : - 159693-----10 
[2m2016-09-28 15:42:20.484[0;39m [32m INFO[0;39m [35m63710[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mc.g.p.b.managers.impl.PartSynchManager [0;39m [2m:[0;39m JobControllerV1 >>>>>>>1 
[2m2016-09-28 15:42:20.491[0;39m [32m INFO[0;39m [35m63710[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mc.g.p.b.r.PartSynchRepositoryImpl  [0;39m [2m:[0;39m Inside InsertParts>>>>Before Merge Component-serialized_id>>>>0>>>CSI>>null 
Hibernate: select webcrtseri0_.cmpnt_srlzd_seq_id as cmpnt_srlzd_seq_id1_3_0_, webcrtseri0_.child_sys_asmbly_id as child_sys_asmbly_i2_3_0_, webcrtseri0_.crtd_by as crtd_by3_3_0_, webcrtseri0_.crtn_dt as crtn_dt4_3_0_, webcrtseri0_.csinv_sl_num as csinv_sl_num5_3_0_, webcrtseri0_.cust_supplied_ind as cust_supplied_ind6_3_0_, webcrtseri0_.incmng_dpm_ind as incmng_dpm_ind7_3_0_, webcrtseri0_.incmng_srl_num as incmng_srl_num8_3_0_, webcrtseri0_.itm as itm9_3_0_, webcrtseri0_.job_seq_id as job_seq_id10_3_0_, webcrtseri0_.lst_updtd_by as lst_updtd_by11_3_0_, webcrtseri0_.lst_updt_dt as lst_updt_dt12_3_0_, webcrtseri0_.outgng_dpm_ind as outgng_dpm_ind13_3_0_, webcrtseri0_.otgng_pn as otgng_pn14_3_0_, webcrtseri0_.otgng_sn as otgng_sn15_3_0_, webcrtseri0_.prt_num as prt_num16_3_0_, webcrtseri0_.prev_job_num as prev_job_num17_3_0_, webcrtseri0_.num_of_prev_rprs as num_of_prev_rprs18_3_0_, webcrtseri0_.repl_ind as repl_ind19_3_0_, webcrtseri0_.sub_cmpnt_seq_id as sub_cmpnt_seq_id20_3_0_, webcrtseri0_.set_sys_asmbly_id as set_sys_asmbly_id21_3_0_ from webcrt_cmpnt_srlzd webcrtseri0_ where webcrtseri0_.cmpnt_srlzd_seq_id=? 
Hibernate: select WEBCRT_CMPNT_SRLZD_SEQ.nextval from dual 
[2m2016-09-28 15:42:20.628[0;39m [32m INFO[0;39m [35m63710[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mc.g.p.b.r.PartSynchRepositoryImpl  [0;39m [2m:[0;39m Inside InsertParts>>>>After merge Component-serialized_id>>>>0 
Hibernate: insert into webcrt_cmpnt_srlzd (child_sys_asmbly_id, crtd_by, crtn_dt, csinv_sl_num, cust_supplied_ind, incmng_dpm_ind, incmng_srl_num, itm, job_seq_id, lst_updtd_by, lst_updt_dt, outgng_dpm_ind, otgng_pn, otgng_sn, prt_num, prev_job_num, num_of_prev_rprs, repl_ind, sub_cmpnt_seq_id, set_sys_asmbly_id, cmpnt_srlzd_seq_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

回答

1

merge()方法返回實際的實體,它是持久性上下文的一部分,但不是傳遞對象到merge()方法的一部分。 您可以通過merge()方法從返回的Entity對象中獲取主鍵。

WebCrtSerializedComponent webCrtCom = entityManager.merge(webCrtPart); 

'webCrtCom'對象將具有主鍵。但意識到webCrtCom對象的持久化上下文。

+0

這個對象確實有主鍵,我的問題得到解決 – sromit

0

基於示例的結構,很可能是webCrtPartList不是管理實體。您需要使用EntityManager.merge()的響應來獲取託管實體(EntityManager.merge()的參數不一定會被管理)

2

合併方法返回一個持久對象,它不會把你發送給它的對象變成一個持久的對象。

這裏是一個老的文檔,但我相信我們在這裏討論的具體細節在最近的版本保持不變: https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#merge(java.lang.Object)

所以你就應該這樣做:

webCrtPart = session.merge(webCrtPart); 
在mergeEntity

(webCrtPart)方法

+0

這與Mohit的回答非常相似,我可以得到密鑰 – sromit