我有下一个实体。 Car
与Human
有许多关系。我在汽车和用户
@Entity
public class Car implements Serializable
{
//...
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "car")
private Set<Assign> cars = new HashSet<Assign>();
//...
}
@Entity
class Assign implements Serializable
{
//...
@LazyCollection(LazyCollectionOption.FALSE)
@ManyToOne
@JoinColumn(name = "HUMAN_CAR", nullable = false)
private Human human;
@LazyCollection(LazyCollectionOption.FALSE)
@ManyToOne
@JoinColumn(name = "CAR_HUMAN", nullable = false)
private Car car;
//..
}
@Entity
public class Human implements Serializable
{
//...
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "human")
private Set<Assign> cars = new HashSet<Assign>();
// ...
}
现在我尝试删除容器管理事务中的汽车
public void deleteCar(final long id)
{
final Car car = entityManager.find(roleId, Car.class);
entityManager.remove(car);
}
但我得到
Caused by: javax.persistence.EntityNotFoundException: deleted entity passed to persist: [com.dto.Assign#<null>]
答案 0 :(得分:1)
在删除car
之前,您需要先从car
删除Assign
。
这里还有另一个设计问题。 CascadeType.ALL
实体中的cars
上有Car
,这意味着Car及其分配具有组合关系(不仅仅是聚合/关联关系)。另一方面,人类及其分配之间存在同样的关系。显然,分配cars
可以在汽车和人之间共享,但组合关系遵循非共享语义。假设有人删除汽车并级联删除其分配,person
方共享的那些将成为孤儿。
答案 1 :(得分:1)
在删除Assign
Car
- s
public void deleteCar(final long id)
{
final Car car = entityManager.find(roleId, Car.class);
for(Assign assign : car.getAssigns()) {
entityManager.remove(assign);
}
entityManager.remove(car);
}
您的getter可能名称不同,我看不到该代码。