我在一个实体(父级)中有2列的复合主键,而在其他实体(子级)中有4列的复合主键我想创建一个包含2列子列的外键复合主键的一部分,引用父列的两列复合主键。由于子列是主键的一部分,我无法使它成为主键的一部分 “insertable = false,updatable = false” 那么我得到的主键不能是null异常。
@Entity
@IdClass (MyKey.class)
@Table (name = "Child_Table")
public class Child {
@Id
@XmlElement (name = "C_feild1", required = true)
protected String C_feild1;
@Id
@XmlElement (name = "C_feild2", required = true)
protected String C_feild2;
@Id
@XmlElement (name = "C_feild3", required = true)
protected String C_feild3;
@Id
@XmlElement (name = "C_feild4", required = true)
protected String C_feild4;
//getters and setters
}
@Entity
@IdClass (MyKey2.class)
@Table (name = "Parent_Table")
public class Parent {
@Id
@CascadeOnDelete
@XmlElement (name = "P_feild1", required = true)
protected String P_feild1;
@Id
@XmlElement (name = "P_feild2", required = true)
protected String P_feild2;
//getters and setters
}
我想在这些实体之间创建一个如下所示的关系
ALTER TABLE Child_Table
添加约束fk_child_table_parent_table
外键(C_field1
,C_field2
)
参考Parent_Table
(P_field1
,P_field2
)
ON DELETE CASCADE;
应允许独立更新表,并在父项被删除时删除子行。
答案 0 :(得分:0)
如果您需要JPA以了解删除Parent实体时需要执行的操作,则需要设置实体之间的关系。
这适用于:
@Embeddable
public class ChildKey {
protected String C_feild3;
protected String C_feild4;
protected MyKey2 parentKey;
}
public class Child {
@EmbeddedId
ChildKey id;
@MapsId("parentKey")
@JoinColumns({
@JoinColumn(name="C_feild1", referencedColumnName="P_field1"),
@JoinColumn(name="C_feild2", referencedColumnName="P_field2")
})
protected Parent parent;
//getters and setters
}
@Entity
@IdClass (MyKey2.class)
@Table (name = "Parent_Table")
public class Parent {
@Id
protected String P_feild1;
@Id
protected String P_feild2;
@OneToMany(mappedby="parent")
@CascadeOnDelete
List<Child> children;
//getters and setters
}
这忽略了您用于XML的扁平性,因此可能不是您想要处理的内容。
如果你想保留扁平物体,JPA对父子关系一无所知,但它也不需要。您需要做的就是清理可能已从共享缓存中删除的所有子实例,或者只是不为子类启用共享缓存,如下所述: https://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F