2017-04-17 110 views
2

我讀JPA 2.1規範,並有這樣的片段:JPA和Hibernate - 「堅持操作」

一個新的實體實例成爲管理的和持久的通過調用 在其上或通過persist方法級聯堅持操作。是 語義的持續運作,應用到實體X作爲 如下:...

是否可以調用persist操作不明確調用persist()方法或持續操作總是要觸發通過調用persist()?

比方說,我有兩個實體A和B,其中A具有OneToMany(cascade=PERSIST)與B.

關係

tx.begin(); 
A a = new A(); 
B b = new B(); 
a.getBCollection().add(b); 
entityManager.persist(a); 
tx.commit(); 

一樣:

tx.begin(); 
A a = new A(); 
entityManager.persist(a); 
B b = new B(); 
a.getBCollection().add(b); 
tx.commit(); 

在第二個例子即使實體是在調用persist()方法後添加的,B實體是否會被持久化(持續操作將被級聯)?或者我必須在調用persist()方法之前將B實體添加到集合中,就像在第一個示例中那樣,只有這樣持久化操作纔會級聯?

又是怎麼回事兩個交易#3例子:

tx1.begin(); 
A a = new A(); 
entityManager.persist(a); //persist with key 1L 
tx1.commit(); 

tx2.begin() 
B b = new B(); 
A a = entityManager.find(A.class, 1L); 
a.getBCollection().add(b); 
tx2.commit(); 

沒有堅持在第二次交易()方法的調用,但A處於受控狀態,所以會在B實體被持久化?

回答

1

JPA specification,部分3.2.4(節選):

刷新操作,應用到實體X如 的語義如下:

  • 如果X是一個被管實體,它被同步到數據庫。
    • 對於由從X的關係中引用的所有實體Y,如果Y的關係已經被註釋與級聯元件值 級聯=持續或級聯= ALL,persist操作被施加於Y

所以,答案是肯定的,b在所有的例子通過沖洗時間從a級聯PERSIST操作,它仍然存在。

+0

所以CascadeType.PERSIST不直接連接到persist()方法,MERGE merge()等?我總是這麼想 – swch