2011-08-22 196 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