JPA:实体映射与复合主键和单个键(JPA: Entity mapping with composi

2019-09-29 06:02发布

JPA 2,休眠4。

从创建一个数据库视图实体。 我有困难得到这两个实体正确映射。 我有一个复合键父实体和子实体具有单个值的关键。

这两者之间的关系由具有父的复合关键字一部分的儿童实体定义。 试图让两者之间的关联。

复合键类

@Embeddable
public Class ParentID implements Serializable {

    private static final long serialVersionUID = 1L;

    private long keyIdOne;
    private String keyIdTwo;
    ....
}

父类

@Entity
public class Parent {
    @EmbeddedId
    protected ParentID id;
    ....

    @OneToMany
    private List<Child> childList;
}

子类

@Entity
public class Child {
    @Id
    private long Id;

    private long keyIdOne //FK to part of the parentId composite key
    .....


    @ManyToOne
    private Parent parent;
}

我不完全知道如何让映射工作。 从孩子到父母的关系是keyIdOne值。 但是,如果这是在父组合键我不知道如何让他们加入该值的一部分。

在子类中,我无法使用:

@ManyToOne
@JoinColumn(name="keyIdOne", referencedColumnName="keyIdOne") 
private Parent parent;

因为它抛出的一个错误:

儿童referencedColumnNames(keyIdOne)是未映射到单个属性引用父。

任何帮助深表感谢。

Answer 1:

我相信这个问题对这个问题是在PK-FK(主键 - 外键)约束。

综上所述:

Parent:
| keyIdOne | keyIdTwo |
|----------|----------|
|    1     |    a     |
|    1     |    b     |
|    3     |    a     |

Child:
| id | keyIdOne |
|----|----------|
| 2  |    1     |
| 3  |    3     |

外键必须在它的引用表(参考单行http://en.wikipedia.org/wiki/Foreign_key )。 哪一行父就不会Child.keyIdOne参考,如果孩子有keyIdOne = 1

我觉得有这方面的工作的,通过使用@MapsId()注释的可能性。 然而,这只会在逆工作。 例:

Parent:
| keyIdOne |
|----------|
|    1     |
|    3     |

Child:
| keyIdOne | keyIdTwo |
|----------|----------|
|    1     |    a     |
|    1     |    b     |
|    3     |    a     |

在这种情况下,你可以有它的复合键与父母的儿童地图部分:

@MapsId("keyIdOne")
private Parent parent;

@MapsId只能在一个OnetoOne和多对一( http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html )



文章来源: JPA: Entity mapping with composite primary key and single key