2013-10-08 124 views
0

我有這樣一類發現...JPA從複合鍵

@Entity 
public class User{ 
    private String userId; 
    @Id 
    public String getUserId(){ 
    return userId; 
    } 
    public void setUserId(String userId){ 
    this.userId = userId; 
    } 
} 

@Embeddible 
public class RegPk{ 
    private String serial; 
    private String userId; 
    .... 
} 

@Entity 
@IdClass(RegPk.class) 
public class Registration { 
    private String userId, serial; 

    private User user 

    @Id 
    @Column(name="SRL_C") 
    public String getSerial() {return serial;} 
    public void setSerial(String serial) {this.serial = serial;} 
    @ManyToOne(cascade={CascadeType.REFRESH}) 
    @JoinColumn(name="USERID", referencedColumnName="USERID", nullable = false) 
    public User getUser() {return user;} 
    public void setUser(User user) {this.user = user;} 
    @Id 
    @Column(name="USERID", nullable = false) 
    public String getUserId() { 
    return userId; 
    } 
    public void setUserId(String userId) { 
    this.userId = userId; 
    } 

} 

RegPk pk = new RegPk(); 
pk.setSerial(dr.getSerial()); 
pk.setUserId(dr.getUserId()); 
Registration userOld = em.find(Registration.class, pk); 

但是當我嘗試運行它,我得到空回來。我發誓我認爲我有它的工作,所以...

1.)這種事情甚至可能嗎? 2.)我做錯了什麼?

回答

1

是的,這是可能的,只要您使用MapsId annotation。否則,你有兩個不同的字段映射到同一列,這是無效的。

javadoc提供了一個與您的情況幾乎完全匹配的示例。

+0

所以在這種情況下,我的列註釋是在PK類? – Jackie

+0

仍然回頭爲空,我將按照您所述創建第二個示例。也許我做了一件容易出錯的事 – Jackie