java - jpa 映射以删除单个实体

标签 java jpa playframework

在我的java web应用程序(使用playframework)中,我有一个客户,其地址映射如下

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

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

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

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 输入相同的地址1。

现在都有Address1;

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不允许进行任何孤儿删除。我是否必须在代码中清理它,可能正在对此类单独的实体进行一些检查?

欢迎任何指点

最佳答案

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

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

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

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

关于java - jpa 映射以删除单个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453051/

相关文章:

java - 使用 BufferedReader 跳过行

java - 在java中将字母表示为数字

使用 Netbeans 的 Java 桌面应用程序

java - 使用时间戳的 JPA 查询问题

java - 如何让bean持久化?

java - UDP 中数据报包的使用

java - Hibernate JPA DB2 自定义数据类型

scala - 触发编译中未执行编译之前的 SBT 任务

gradle - 在 Gradle 中使用 PlayFramework + Ebean

java - 如何在 Play 框架 1.3.x 中以编程方式设置事务隔离级别?