2014-02-25 79 views
6

我想设置我的实体允许PKS。我的数据库包含两个字段,Hibernate的JPA多对一复合键

dealer_detail_id PK user_detail_id PK

无论是在相应的表上的ID加入。

迄今没有成功,我已经试过这一点。

@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; 

任何人能发现我在做什么错?

回答

1

试试这个

@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; 
    } 

} 

@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(); 
    } 
    } 
+0

我没有看到任何生成错误,但是当我对表运行以下查询时,我得到零结果列表 dealerUsers = session.createCriteria(DealerUser.class).list(); –

+0

我最终只是错过了@Entity。 –

9

这是正确的:

@Embeddable 
public class DealerUserPk implements Serializable { 

    private Integer dealerDetail; 
    private Integer userDetail; 
  1. 但是你DealerUser标注有可嵌入它应该是@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; 
    

与尝试。

+0

我不能测试你的答案做我很沮丧的设计,只是决定把PK列到位,下降复合PK的事实。事实证明,我错过了我认为导致整个问题的@Entity。 –