2017-06-15 79 views
2

我成功配置Hibernate以使用批量查詢來創建/更新對象,但是有一種情況尚未運行。有多個ManyToMany關係的Hibernate批處理事務

我有3個實體: - 主要實體 - 實體A - 實體B

主要實體有兩個實體A和實體B.主要實體多對多關係是關係的擁有者:

@ManyToMany 
@JoinTable(name = "MAIN_A", joinColumns = { 
@JoinColumn(name = "MAIN_UID", nullable = false, updatable = false) }, inverseJoinColumns = { 
@JoinColumn(name = "A_UID", nullable = false, updatable = false) }) 
private Set<EntityA> entitiesA = new HashSet<>(0); 

@ManyToMany 
@JoinTable(name = "MAIN_B", joinColumns = { 
@JoinColumn(name = "MAIN_UID", nullable = false, updatable = false) }, inverseJoinColumns = { 
@JoinColumn(name = "B_UID", nullable = false, updatable = false) }) 
private Set<EntityB> entitiesB = new HashSet<>(0); 

我寫了一個3個簡單的測試。 首先,我在數據庫中創建了一些實體A和實體B行(這與所有2個測試用例共同)。

第一種情形:爲所有的主要實體和MAIN_A表條目只有一個插件: 創建n個主要實體和每個只有實體A

結果設置。所以在這種情況下浴槽插入工作正常。

第二種情況: 創建n個主要實體和每個只設置實體B

結果:只有一個插入的主要實體和MAIN_B表中的所有條目。所以在這種情況下浴槽插入工作正常。

第三種情況: 創建n個主要實體併爲每個都設置實體A和實體B

結果:只有一個插入的所有主要實體和ñ插入兩個MAIN A和MAIN_B表條目。在這種情況下批量插入不起作用。我Google搜索,但我找不到答案。

有沒有人知道它爲什麼沒有按預期在第三種情況下工作?我做錯了什麼?配置中是否有解決我需求的任何問題?

的3個場景的代碼是非常簡單的:

Set<EntityA> setA; 
    Set<EntityB> setB; 
    for (long i = 1; i < n; i++) { 

    MainEntity e = new MainEntity(); 
    ac.setEntitiesA(setA); //this is commented in the second scenario 
    ac.setEntitiesB(setB); // this is commented in the first scenario 

    session.save(e); 
} 

我張貼在休眠論壇相同qestion:Hibernate Forum post

+0

您可以添加用於執行第三種情況的代碼嗎? –

+0

@MaciejKowalski我剛剛更新了代碼 – Simone

回答

0

看來你只能保存MainEntity(我假設添加到集合中的EntityA,B是新的實體)。

在我看來,你應該至少在這個級聯選項添加到您的每一個單向的關係:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 

否則,你應該調用保存在每個EntityA的,EntityB

+0

的問題EntityA和EntityB被保存之前......我觀察到的是關係表中的更新沒有在第三種情況下使用批量插入 – Simone

+0

我仍然試圖改變級聯類型但它沒有任何區別... 我的問題不在於在數據庫中創建EntityA和EntityB。 我的問題是關於Hibernate如何在關係表Main_A和Main_B中插入數據......在第三種情況下,批處理插入未使用,Hibernate執行300次插入查詢而不是1.在方案1和2中不會發生這種情況我還沒有找到解釋! – Simone