JPA OneToMany with Jointable,删除 link 删除 right-side object
JPA OneToMany with Jointable, deleting a link deletes right-side object
(OpenJPA2.x) 我有 Parent->(linktable)-> 类别关系。如果我从 parent 的类别数组中删除类别,它会从 linktable (unlinked) 中正确删除。将新类别添加到数组会插入到 linktable。但是问题是 类别目标实体也从类别 table. 中删除我已经调试了 jdbc 查询并且它由 OpenJPA 库执行,db tables没有级联删除约束。
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
Parent->类别 link 使用 OneToMany 注释编辑。 Category 不知道它是从哪里 link 编辑的,因此更愿意在没有任何 link 注释的情况下尽可能保持该实体 class 干净。
@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 模式模式。
您用 orphanRemoval=true
注释了关联。这恰恰意味着必须删除从其父项中删除并因此成为孤儿的类别。
(OpenJPA2.x) 我有 Parent->(linktable)-> 类别关系。如果我从 parent 的类别数组中删除类别,它会从 linktable (unlinked) 中正确删除。将新类别添加到数组会插入到 linktable。但是问题是 类别目标实体也从类别 table. 中删除我已经调试了 jdbc 查询并且它由 OpenJPA 库执行,db tables没有级联删除约束。
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
Parent->类别 link 使用 OneToMany 注释编辑。 Category 不知道它是从哪里 link 编辑的,因此更愿意在没有任何 link 注释的情况下尽可能保持该实体 class 干净。
@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 模式模式。
您用 orphanRemoval=true
注释了关联。这恰恰意味着必须删除从其父项中删除并因此成为孤儿的类别。