(OpenJPA2.x) У меня есть родительский -> (linktable) -> Отношение категорий. Если я удалю категорию из массива категорий родителя, она будет правильно удалена из таблицы ссылок (несвязанной). Добавление новой категории в массив будет вставлено в таблицу ссылок. Однако проблема Категория целевой цели также удаляется из таблицы Category. У меня есть отлаженные jdbc-запросы, и это выполняется библиотекой OpenJPA, таблицы db не имеют ограничения на каскадное удаление.JPA OneToMany with Jointable, удаление ссылки удаляет правый объект
Parent(key=ServerId,Code)
ServerId|Code |Name
1 |code1|name1
1 |code2|name2
1 |code3|name3
2 |code1|name4
Category(key=ServerId,Code)
1 |cat1 |child1
1 |cat2 |child2
2 |cat2 |child3
LinkTable(key=ServerId,PCode,CCode)
ServerId|PCode|CCode
1 |code1|cat1
1 |code1|cat2
1 |code3|cat1
Родитель-> Категории связаны друг от друга аннотации OneToMany. Категория не знает, откуда она была связана, поэтому предпочитайте, чтобы класс сущности был чистым, насколько это возможно, без каких-либо аннотаций ссылки.
@Entity @Table(name="Parent") @Access(AccessType.FIELD)
public class Parent {
@EmbeddedId Parent.PK pk; // contains serverId+code fields
private String name;
@OneToMany(fetch=FetchType.LAZY, orphanRemoval=true, cascade=CascadeType.PERSIST)
@JoinTable(name="LinkTable",
joinColumns={
@JoinColumn(name="ServerId", referencedColumnName="ServerId", nullable=false),
@JoinColumn(name="PCode", referencedColumnName="Code", nullable=false)
},
inverseJoinColumns={
@JoinColumn(name="ServerId", referencedColumnName="ServerId", nullable=false),
@JoinColumn(name="CCode", referencedColumnName="Code", nullable=false)
}
)
private List<Category> cats;
public List<Category> getCategories() { return cats; }
}
@Entity @Table(name="Category") @Access(AccessType.FIELD)
public class Category {
@EmbeddedId Category.PK pk; // serverId,Code fields
private String name;
// this entity don't have OneToMany,ManyToOne,etc.. links back to parent
}
Это унаследованное приложение я должен использовать первичные ключи композитов, но это не должно быть проблемой JPA я думаю, все-таки это правильный шаблон SQL схемы.
Ну, это было легко, мои слепые глаза не могли это увидеть по какой-то причине, или я думал, что это означает «удалить строку ссылки, если родитель удален». Ясно, что это не так. – Whome