2011-08-22 136 views
9


我有休眠工作,不是很知道如何解决这个问题,我有2表这样的1..1关系的一部分:
Hibernate的外键的主键

 
------- 
TABLE_A 
------- 
first_id (pk) 
second_id (pk) 
[other fields] 

------- 
TABLE_B 
------- 
first_id (pk)(fk TABLE_A.first_id) 
second_id (pk)(fk TABLE_A.second_id) 
third_id (pk) 
[other fields] 

如何使用Hibernate管理这个?

我不知道如何来管理第二个表的主键...

回答

14

有一个例子与您在Hibernate reference documentation中的情况完全相似。在这个例子之前,你会找到解释。这里的例子,它匹配您的问题(用户是表A,和客户是表B):

@Entity 
class Customer { 
    @EmbeddedId CustomerId id; 
    boolean preferredCustomer; 

    @MapsId("userId") 
    @JoinColumns({ 
     @JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"), 
     @JoinColumn(name="userlastname_fk", referencedColumnName="lastName") 
    }) 
    @OneToOne User user; 
} 

@Embeddable 
class CustomerId implements Serializable { 
    UserId userId; 
    String customerNumber; 

    //implements equals and hashCode 
} 

@Entity 
class User { 
    @EmbeddedId UserId id; 
    Integer age; 
} 

@Embeddable 
class UserId implements Serializable { 
    String firstName; 
    String lastName; 

    //implements equals and hashCode 
} 

注:这将是更简单得多,你有这两个表的替代标识符。除非你被迫处理一个遗留模式,否则你可以自己帮忙并使用代理键。

+0

但是,如果我更改而不是将OneToOne注释放在客户上,您是否知道是否有一些问题,请将OneToMany放在用户类上? – rascio

+0

您必须将其设为双向OneToMany/ManyToOne关联。 –

+0

这样做,我得到'属性'userId'在这个上下文中具有无效的映射'CustomerId' –

3

使用@PrimaryKeyJoinColumn@PrimaryKeyJoinColumns注解。从Hibernate manual

@PrimaryKeyJoinColumn注释不说,实体的主键被用作外键值到相关实体。

+2

这并没有回答OP的问题:他有一个复合主键,这个复合主键的一些字段构成了另一个实体的外键。主键也是外键时使用@PrimaryKeyJoinColumn。 –

0
public class User implements Serializable { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 5478661842746845130L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
} 
@Entity 
public class Author { 

    @Id 
    @Column(name = "AUTHOR_ID", nullable = false) 
    private int authorId; 
    @Column(name = "ENABLED", nullable = false, length = 1) 
    private boolean enabled; 

    @OneToOne 
    @MapsId 
    @JoinColumn(name = "AUTHOR_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false) 
    User user; 

    public boolean isEnabled() { 
     return enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

} 
+0

我的问题有点不同,在我的情况下,'用户'实体具有'username'和'email'作为PK所以我可以有相同的用户名关联到不同的电子邮件)和'Author'拥有与'User'('username','email')和'vatCode'相同的PK,而不仅仅是你的例子中的'id'; ) – rascio