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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 11:57:53  来源:igfitidea点击:

Hibernate JPA ManyToOne composite key

javahibernatejpa

提问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;
  1. But your DealerUser is annotated with embeddable it should be @Entity as you are using @Table annotation.
  2. 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;
    
  1. 但是您的 DealerUser 是用 embeddable 注释的,它应该是 @Entity ,因为您使用的是 @Table 注释。
  2. 需要添加 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.

试试看。