При разработке приложения 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, чтобы избежать этого без всякой удачи ...).
Спасибо за ваше внимание и будьте добры с моим английским, это не мой родной язык;)