Не удалось обновить отношение JPA ManyToMany из-за ключа ограничения в другом отношении - PullRequest
0 голосов
/ 05 октября 2011

При разработке приложения Eclipse GEF с использованием реализации eclipselink в JPA я обнаружил ошибку, которая меня раздражала некоторое время:

У меня есть три разных класса:

Первыйпредставляет переменную, содержащуюся в модели:

@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, которая может содержать значение переменной.

@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 создает таблицу для списка переменных отношения-variable и другое отношение с editpart и variablelist, поэтому, как только я пытаюсь обновить модель в базе данных после некоторых модификаций, он пытается автоматически удалить переменную и в результате выдает ошибку нарушения ограничения, вызванную тем, чтосписок переменных, удерживаемых моделью, по-прежнему указывает на эту переменную (что, кстати, я не былготовясь к удалению, и я протестировал множество различных cascadeType, чтобы избежать этого без всякой удачи ...).

Спасибо за ваше внимание и будьте добры с моим английским, это не мой родной язык;)

1 Ответ

0 голосов
/ 06 октября 2011

Похоже, у вас очень взаимосвязанная модель, в которой все циклически ссылается на все.Когда вы удаляете переменную, вы удаляете все ссылки на нее?Тебе нужно.

...