复合主键与作为主键一部分的复合外键(EclipseLINK)之间的关系

时间:2017-03-28 07:42:58

标签: java jpa eclipselink

我在一个实体(父级)中有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_field1C_field2)   参考Parent_TableP_field1P_field2)   ON DELETE CASCADE;

应允许独立更新表,并在父项被删除时删除子行。

1 个答案:

答案 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