簡體   English   中英

Java JPA flush()不會以一對多關系更新數據庫嗎?

[英]Java JPA flush() doesn't update database in one to many relationship?

所以我有一個Person類,它與Address類具有一對多的關系(不是真正在我的代碼中,而是類似這樣,只是為了使它更簡單)。

我試圖將null設置為地址,然后刷新它,然后用新地址重新插入,但是由於即使將地址設置為null然后刷新它,地址表中也可能存在重復鍵,因此無法正常工作。

我需要先刪除每個地址,然后將它們設置為null,然后刷新。

-------------------------------------------------------------
// 1, this won't work, duplicate key exception when committing in Address table if there is a same address in newAddress with address in this person addresses

em.getTransaction().begin();
person.setAddresses(null);
em.flush();

// print the address, count is still the same with before depends on how many address this person has

String query = "SELECT P.addresses FROM Person P WHERE P = :pr"; 
ObservableList<Address> addresses= FXCollections.observableArrayList(
                                          em.createQuery(query, Address.class)
                                            .setParameter("pr", person)
                                            .getResultList());
System.out.println("COUNT: " + addresses.size() +  " name: " +  addresses.get(0).getName());  

person.setAddresses(newAddresses);
em.commit();             // exception

-----------------------------------------------------------------------

// 2, this works

em.getTransaction().begin();
for(Address a : person.getAddresses() {
em.remove(a);
}
person.setAddresses(null);
em.flush();

// print the address, count is still one and its null

String query = "SELECT P.addresses FROM Person P WHERE P = :pr"; 
ObservableList<Address> addresses= FXCollections.observableArrayList(
                                          em.createQuery(query, Address.class)
                                            .setParameter("pr", person)
                                            .getResultList());
System.out.println("COUNT: " + addresses.size() ); 
em.commit();         // fine

---------------------------------------------------------------------

一對多關系由所有者一方控制,這是您所要解決的問題。 因此,您必須從地址中設置/刪除關系。

Person.setAddresses對JPA無效,正確的方法是遍歷地址並設置address.person = null或完全刪除地址。 其余應遵循。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM