【问题标题】:jpa mapping to remove a lone entityjpa 映射以删除一个单独的实体
【发布时间】:2011-09-17 06:55:59
【问题描述】:

在我的java web app(使用playframework)中,我有一个Customer 有一个像这样映射的Address

@Entity
class Customer extends Model{
    @ManyToOne
    Address address;
...
}

@Entity
class Address extends Model{
    String addressline1;
   ...
}

我有一个 setCustomerAddress(..) 方法,它接受用户输入,r 从 db 中获取匹配的地址或创建一个新地址,然后如果客户地址为空或不同,则设置输入地址。

public static void setCustomerAddress(...){
   Customer = Customer.findById(custId);
   Address address = findOrCreateAddress(addressline1,...);
   if ((customer.getAddress()==null) || (!customer.getAddress().equals(address))) {
    customer.setAddress(address);
    customer.save();
}
...
}

customer1 创建一个 Address1。 customer2 输入相同的 Address1。

现在两者都有地址 1;

id | addressline1 | addressline2 | country 
----+--------------+--------------+---------
 25 |apple st.     |              | US


id  |name          |address_id
----+--------------+------------
1   |jim           |25
2   |roy           |25

如果customer2添加了addressline2,则认为该地址不同,因此创建一个新地址

地址表

 id | addressline1 | addressline2 | country 
----+--------------+--------------+---------
 25 |apple st.     |              | US
 26 |apple st.     |richman's end | US

客户表

id  |name          |address_id
----+--------------+------------
1   |jim           |25
2   |roy           |26

假设,customer1通过添加与customer2相同的addressline2来更新他的地址,现在他的address_id指向customer2的地址 客户表

id  |name          |address_id
----+--------------+------------
1   |jim           |26
2   |roy           |26

这会留下不属于任何客户的地址记录 (25)。

这应该留在数据库中吗?还是应该删除?哪种做法是正确的?我猜ManyToOne不允许任何孤儿删除。我是否必须在代码中清理它,可能正在检查这些孤立的实体?

欢迎指点

【问题讨论】:

标签: java jpa playframework


【解决方案1】:

只能对 JPA 2.0 中的 @OneToOne@OneToMany 注释关系进行孤立删除。

@ManyToOne 的情况下,孤立删除不是一个有效的术语,因为当不存在子实体时,您正试图删除一个“父级”。与被删除的子实体相比,这是一个完全不同的场景,当它没有父实体时(即它已被孤立)。

如果您认为必须在数据库中删除Address 记录,当不存在Customer 记录时,您必须编写代码删除Address 实体,当没有Customer 实体引用它时。我不知道您的其余代码,但这看起来像是 SQL(本机)或 JPQL 查询获取所有此类 Addresses 的工作。

请注意,由于前面所述的原因,在这种情况下无法使用 JPA 2.0 中的孤立删除功能。因此,使用Address 实体中的@OneToMany 注释属性(将orphanRemoval 属性设置为true)创建双向关系不会导致删除未引用的Address 记录。但是,您可以创建双向关系以避免使用 SQL 或 JPQL 查询(因为您可以在 Address 的集合属性中计算 Customers 的数量)。

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2021-09-13
    • 2013-12-16
    • 2015-10-03
    相关资源
    最近更新 更多