【发布时间】:2016-01-24 02:55:59
【问题描述】:
所以我有一个 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
---------------------------------------------------------------------
【问题讨论】:
-
哦,顺便说一下,这是在 JSE 而不是 JEE