2011-04-20 55 views
1

我正在開發一個使用JPA 2.0實體,Hibernate 3.6.2和Spring 3的示例Web應用程序。該示例包含一對一關係中的兩個表,父實體是Client而孩子是地址,地址中的PK引用客戶表(識別關係)。實體不匹配中的共享PK

運行JUnit測試中,我注意到一個奇特的問題,這兩個實體,它是子實體與(parentId的+ 1)仍然存在的問題,我的對應關係如下:

@Entity 
public class Client implements Serializable{ 
    private Long clientId; 
    private Address address; 
    //Other fields 

    @Id 
    @GeneratedValue 
    public Long getClientId(){return this.clientId;} 
    public void setClientId(Long id){this.clientId=id;} 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="clientid",referencedColumnName="fk_clientid") 
    public Address getAddress(){return this.address;} 
} 

和子實體:

@Entity 
public class Address implements Serializable{ 
    private Long fkClientId; 
    private Client client; 
    //Other fields 

    @Id 
    @GeneratedValue 
    public Long getFkClientId(){return this.fkClientId;} 
    public void setFkClientId(Long id){this.fkClientId=id;} 

    @OneToOne(mappedBy="address")   
    public Client getClient(){return this.client;} 
} 

在我的測試方法,我用他們制定者同時連結對象,但經過堅持實體和執行行:

assertEquals(client.getClientId, client.getAddress().getFkClientId); 

測試失敗,異常

java.lang.AssertionError: expected:<654> but was:<655> 

我readed類似的問題和存在的問題,但幾乎所有的人都從JPA 1.0,它supossed在JPA2.0共享密鑰自動分配。我錯過了什麼?

回答

1

這種映射的正確版本顯示在javadoc of @OneToOne。請注意,派生身份的一方應該是關係的擁有方(無mappedBy):

@Entity 
public class Client implements Serializable {  
    @Id 
    @GeneratedValue 
    private Long clientId;  

    @OneToOne(mappedBy = "client", cascade = CascadeType.ALL) 
    private Address address; 

    ... 
} 

@Entity 
public class Address implements Serializable { 
    @Id 
    private Long fkClientId; 

    @OneToOne 
    @MapsId 
    @JoinColumn(name = "fk_clientid") 
    private Client client; 

    ... 
} 
+0

非常感謝!我對這種關係的擁有方面感到困惑,以及它是如何在JPA2.0規範中實現的 – Jairo 2011-04-20 21:17:18