2013-10-08 89 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