【问题标题】:Java JPA flush() doesn't update database in one to many relationship?Java JPA flush() 不会以一对多关系更新数据库?
【发布时间】: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

标签: java jpa flush


【解决方案1】:

一对多关系由所有者方控制,在您的情况下是地址。因此,您必须从地址中设置/删除关系。

Person.setAddresses 对 JPA 没有任何影响,正确的方法是遍历地址并设置 address.person = null 或完全删除地址。其余的应该遵循。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 2018-09-26
    • 2017-05-30
    • 1970-01-01
    • 2020-11-28
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多