Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复合主键与复合外键之间的关系,复合外键是主键的一部分(EclipseLINK)_Java_Jpa_Eclipselink - Fatal编程技术网

Java 复合主键与复合外键之间的关系,复合外键是主键的一部分(EclipseLINK)

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

我在一个实体(父实体)中有2列的复合主键,在另一个实体(子实体)中有4列的复合主键我想创建一个包含两列子项的外键,它是复合主键的一部分,引用父项的两列复合主键。由于子列是主键的一部分,我无法创建它 insertable=false,Updateable=false 然后我得到的主键不能为空异常

@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\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需要删除哪些其他行/实体。您需要设置父级和子级之间的关系才能使用它。