Java 删除单个实体的jpa映射

Java 删除单个实体的jpa映射,java,jpa,playframework,Java,Jpa,Playframework,在我的javaweb应用程序(使用playframework)中,我有一个客户的地址映射如下 @Entity class Customer extends Model{ @ManyToOne Address address; ... } @Entity class Address extends Model{ String addressline1; ... } 我有一个setCustomerAddress(..)方法,它接受用户输入r etrieve从db中删

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

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

@Entity
class Address extends Model{
    String addressline1;
   ...
}
我有一个setCustomerAddress(..)方法,它接受用户输入r etrieve从db中删除匹配的地址或创建新地址,然后如果客户地址为null或不同,则设置输入地址

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

现在两者都有地址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
id  |name          |address_id
----+--------------+------------
1   |jim           |26
2   |roy           |26
假设customer1通过添加与customer2相同的addressline2来更新他的地址,现在他的地址\u id指向customer2的地址 客户表

id  |name          |address_id
----+--------------+------------
1   |jim           |25
2   |roy           |26
id  |name          |address_id
----+--------------+------------
1   |jim           |26
2   |roy           |26
这会留下一个不属于任何客户的地址记录(25)

这应该留在db中吗?还是应该删除?这是正确的做法?我想很多人都不允许删除孤儿。我是否必须在代码中清理这一点,可能是在检查这些单独的实体


任何指针都是受欢迎的

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

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

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


注意,在这种情况下,由于前面所述的原因,不可能在JPA2.0中使用孤立删除功能。因此,在
地址
实体中创建带有
@OneToMany
注释属性的双向关系(将
属性设置为true)不会导致删除未引用的
地址
记录。但是,您可以创建一个双向关系以避免使用SQL或JPQL查询(因为您可以计算
地址
的集合属性中的
客户
)。

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

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

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


注意,在这种情况下,由于前面所述的原因,不可能在JPA2.0中使用孤立删除功能。因此,在
地址
实体中创建带有
@OneToMany
注释属性的双向关系(将
属性设置为true)不会导致删除未引用的
地址
记录。但是,您可以创建一个双向关系,以避免使用SQL或JPQL查询(因为您可以在
地址
的集合属性中计算
客户
的数量)。

您要找的是cascade=“all delete orphan”吗?多对一有可能吗?我只能找到CascadeType.ALLIs cascade=“全部删除孤儿”您在找什么?多对一有可能吗?我只能找到一个