JPA 2,Hibernate 4。
从数据库视图创建实体。我很难让这两个实体正确映射。我有一个具有复合键的父实体,以及一个具有单个值键的子实体。
两者之间的关系由具有Parent的复合键的一部分的Child实体定义。试图在两者之间建立联系。
复合密钥类
@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;
因为它抛出错误:
Child的referencedColumnNames(keyIdOne)引用未映射到单个属性的Parent。
非常感谢任何帮助。
答案 0 :(得分: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有Child.keyIdOne
,那么Parent中的哪一行会keyIdOne = 1
引用?
我认为使用@MapsId()注释有可能实现这一点。然而,这只能反过来。 例如:
Parent:
| keyIdOne |
|----------|
| 1 |
| 3 |
Child:
| keyIdOne | keyIdTwo |
|----------|----------|
| 1 | a |
| 1 | b |
| 3 | a |
在这种情况下,您可以将父组合键的子映射部分放在Parent中:
@MapsId("keyIdOne")
private Parent parent;
@MapsId仅适用于OnetoOne和ManyToOne(http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html)