由于另一个关系中的约束键,JPA ManyToMany关系更新失败

时间:2011-10-05 19:08:00

标签: jpa constraints eclipselink cascade

在使用JPA的eclipselink实现开发Eclipse GEF应用程序时,我发现了一段令我烦恼的错误:

我有三个不同的类:

第一个代表模型中包含的变量:

@Entity
public class Variable extends AbstractVariable{

   @Id
   @Generated value
   private int id;

   /** Lots more of stuff */

   @ManyToOne(cascade=CascadeType.ALL)
   Model model;

   //Setters, getters and the other functions.  
}

abstractvariant类的另一个子类,它是一个可以保存变量串联的变量。

@Entity
public class VariableList extends AbstractVariable{

   @Id
   @Generated value
   private int id;

   /** Lots more of stuff */

   @ManyToMany(cascade=CascadeType.ALL)
   List<AbstractVariable> variables;

   //Setters, getters and the other functions.  
}

第二个类,一个可以保存变量值的gef editpart。

@Entity
public class VariableEditPart{

   @Id
   @Generated value
   private int id;

   /** Lots more of stuff */

   VariableList vars;

   //Setters, getters and the other functions.  
}

使用gef模型的最后一节课:

@Entity
public class Model{

   @Id
   @Generated value
   private int id;

   /** Lots more of stuff */

   @OneToMany(cascade=CascadeType.ALL)
   List<Variable> availableVars;

   @OneToMany(cascade=CascadeType.ALL)
   List<VariableEditPart> editParts;

   //Setters, getters and the other functions.  
}

这里的问题是JPA为关系变量list-variable创建了一个表,并且与editpart和variablelist创建了另一个关系,因此,一旦我尝试在一些修改后更新数据库中的模型,它会自动尝试删除变量,并最终导致约束违规错误,因为模型持有的变量列表仍然指向该变量(顺便说一句,我没有假装删除,我测试了很多不同的cascadeType's没有运气就避免它......)。

感谢您的关注并善待我的英语,这不是我的母语;)

1 个答案:

答案 0 :(得分:0)

看起来你有一个非常相互关联的模型,所有内容都以循环方式引用所有内容。

你在做什么?删除变量时,是否删除了对它的所有引用?你需要。