JPA:使用复合主键和单键进行实体映射

时间:2013-12-07 04:33:01

标签: java hibernate jpa entity composite-key

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。

非常感谢任何帮助。

1 个答案:

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

相关问题