2015-06-25 3 views
0

(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 схемы.

ответ

3

Вы аннулировали связь с orphanRemoval=true. Это точно означает, что категории, которые удаляются из своего родителя и, таким образом, становятся сиротами, должны быть удалены.

+0

Ну, это было легко, мои слепые глаза не могли это увидеть по какой-то причине, или я думал, что это означает «удалить строку ссылки, если родитель удален». Ясно, что это не так. – Whome

Смежные вопросы