Java Hibernate JPA ManyToOne 复合键
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22002739/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate JPA ManyToOne composite key
提问by Code Junkie
I'm trying to setup my entity to allow to pks. My database consist of two fields,
我正在尝试设置我的实体以允许 pks。我的数据库由两个字段组成,
dealer_detail_id pk user_detail_id pk
Dealer_detail_id pk user_detail_id pk
Both join on id in corresponding tables.
两者都在相应表中加入 id。
I've tried this thus far without success.
到目前为止,我已经尝试过这个,但没有成功。
@Embeddable
public class DealerUserPk implements Serializable {
private Integer dealerDetail;
private Integer userDetail;
DealerUser
经销商用户
@Embeddable
@Table(name = "dealer_user", schema = "account")
public class DealerUser implements Serializable {
@EmbeddedId
private DealerUserPk id;
@Id
@ManyToOne
@JoinColumn(name = "dealer_detail_id", referencedColumnName = "id")
private DealerDetail dealerDetail;
@Id
@ManyToOne
@JoinColumn(name = "user_detail_id", referencedColumnName = "id")
private UserDetail userDetail;
DealerDetail
经销商详情
@Entity
@Table(name = "dealer_detail", schema = "account")
public class DealerDetail implements Serializable {
@Id
private Integer id;
UserDetail
用户详细信息
@Entity
@Table(name = "user_detail", schema = "account")
public class UserDetail implements Serializable {
@Id
private Integer id;
Can anybody spot what I'm doing wrong?
任何人都可以发现我做错了什么吗?
回答by Sandhu Santhakumar
Try this
尝试这个
@Embeddable
public class DealerUserPk implements Serializable {
@ManyToOne
private DealerDetail dealerDetail;
@ManyToOne
private UserDetail userDetail;
public void setDealerDetail(DealerDetail dealerDetail) {
this.dealerDetail=dealerDetail;
}
public DealerDetail getDealerDetail(){
return this.dealerDetail;
}
public void setUserDetail(UserDetail userDetail) {
this.userDetail=userDetail;
}
public UserDetail getUserDetail() {
return this.userDetail;
}
}
and
和
@Entity
@Table(name = "dealer_user")
public class ProductItem {
@Id
private DealerUserPk id= new DealerUserPk();
// --- For bidirectional association---
@SuppressWarnings("unused")
@Column(name="dealer_detail_id", nullable=false, updatable=false, insertable=false)
private Integer dealerDetail;
@SuppressWarnings("unused")
@Column(name="user_details_id", nullable=false, updatable=false, insertable=false)
private Integer userDetail;
// ---
public void setDealerDetail(DealerDetail dealerDetail) {
id.setDealerDetail(dealerDetail);
}
public DealerDetail getDealerDetail(){
return id.getDealerDetail();
}
public void setUserDetail(UserDetail userDetail) {
id.setUserDetail(userDetail);
}
public UserDetail getUserDetail() {
return id.getUserDetail();
}
}
回答by Koitoer
This is correct:
这是对的:
@Embeddable
public class DealerUserPk implements Serializable {
private Integer dealerDetail;
private Integer userDetail;
- But your DealerUser is annotated with embeddable it should be @Entity as you are using @Table annotation.
Need to add MapsId as it follows
@Entity @Table(name = "dealer_user", schema = "account") public class DealerUser implements Serializable { @EmbeddedId private DealerUserPk id; @MapsId("dealerDetail") @ManyToOne @JoinColumn(name = "dealer_detail_id", referencedColumnName = "id") private DealerDetail dealerDetail; @Id @MapsId("userDetail") @JoinColumn(name = "user_detail_id", referencedColumnName = "id") private UserDetail userDetail;
- 但是您的 DealerUser 是用 embeddable 注释的,它应该是 @Entity ,因为您使用的是 @Table 注释。
需要添加 MapsId 如下
@Entity @Table(name = "dealer_user", schema = "account") public class DealerUser implements Serializable { @EmbeddedId private DealerUserPk id; @MapsId("dealerDetail") @ManyToOne @JoinColumn(name = "dealer_detail_id", referencedColumnName = "id") private DealerDetail dealerDetail; @Id @MapsId("userDetail") @JoinColumn(name = "user_detail_id", referencedColumnName = "id") private UserDetail userDetail;
Try with that.
试试看。