Java 复合主键与复合外键之间的关系,复合外键是主键的一部分(EclipseLINK)
我在一个实体(父实体)中有2列的复合主键,在另一个实体(子实体)中有4列的复合主键我想创建一个包含两列子项的外键,它是复合主键的一部分,引用父项的两列复合主键。由于子列是主键的一部分,我无法创建它 insertable=false,Updateable=false 然后我得到的主键不能为空异常Java 复合主键与复合外键之间的关系,复合外键是主键的一部分(EclipseLINK),java,jpa,eclipselink,Java,Jpa,Eclipselink,我在一个实体(父实体)中有2列的复合主键,在另一个实体(子实体)中有4列的复合主键我想创建一个包含两列子项的外键,它是复合主键的一部分,引用父项的两列复合主键。由于子列是主键的一部分,我无法创建它 insertable=false,Updateable=false 然后我得到的主键不能为空异常 @Entity @IdClass (MyKey.class) @Table (name = "Child_Table") public class Child { @Id @XmlElem
@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 TABLEChild\u TABLE
添加约束fk\u子表\u父表
外键(C_字段1
,C_字段2
)
参考Parent_Table
(P_field1
,P_field2
)
删除级联
它应该允许在删除父实体时独立更新表并删除子行。如果您需要JPA知道删除父实体时需要做什么,则需要设置实体之间的关系 这将适用于以下情况:
@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
}
@可嵌入
公共类子密钥{
受保护字符串C_feild3;
受保护字符串C_feild4;
受保护的MyKey2父密钥;
}
公营儿童{
@嵌入ID
ChildKey-id;
@MapsId(“父密钥”)
@列({
@JoinColumn(name=“C_feild1”,referencedColumnName=“P_field1”),
@JoinColumn(name=“C_feild2”,referencedColumnName=“P_field2”)
})
受保护的父母;
//接球手和接球手
}
@实体
@IdClass(MyKey2.class)
@表(name=“父表”)
公共类父类{
@身份证
受保护字符串P_feild1;
@身份证
保护管柱P_feild2;
@OneToMany(mappedby=“家长”)
@级联删除
列出儿童名单;
//接球手和接球手
}
这忽略了XML所使用的平面特性,因此可能不是您想要处理的
如果您想保留平面对象,JPA对父子关系一无所知,但实际上也不需要。您只需清理可能已从共享缓存中删除的所有子实例,或者不启用子类的共享缓存,如下所述:
您不能将EclipseLink的CascadeOnDelete放在基本映射上,因为它不会告诉JPA需要删除哪些其他行/实体。您需要设置父级和子级之间的关系才能使用它。