1

我有下一个实体。Car与 具有多对多关系Human。我在CarUser之间使用辅助类Assign

@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>]
4

2 回答 2

1

Assign在删除之前删除-sCar

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);  
} 

您的吸气剂可能有不同的名称,我看不到该代码。

于 2013-01-25T14:17:16.450 回答
1

在删除之前car,您需要先从 中car删除Assign

这里还有另一个设计问题。您拥有实体CascadeType.ALL,这意味着 Car 及其分配具有组合关系(不仅仅是聚合/关联关系)。另一方面,Human 与其指定对象之间也存在相同的关系。显然分配可以在汽车和人之间共享,但组合关系遵循非共享语义。假设一个人删除了一辆汽车并级联删除了它的分配,那些在侧共享的将成为孤儿。carsCarcarsperson

于 2013-01-25T14:09:23.043 回答