有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java删除具有关系的实体

我还有下一个目标CarHuman有许多关系。我正在使用辅助类汽车用户之间分配

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

共 (2) 个答案

  1. # 1 楼答案

    删除Assign-s,然后再删除Car

    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可能有不同的名字,我看不到代码

  2. # 2 楼答案

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

    这里还有另一个设计问题。在Car实体中有CascadeType.ALLcars上,这意味着Car及其赋值具有组合关系(而不仅仅是聚合/关联关系)。另一方面,人与人之间也存在着同样的关系。显然,分配的cars可以在汽车和人之间共享,但组合关系遵循非共享语义。假设一个人删除了一辆车,并级联删除了它的分配,在person端共享的那些将成为孤儿