与@EmbeddedId JPA复合键(JPA Compound key with @Embedde

2019-10-24 05:22发布

在传统的数据库中,我有三个表:用户,工作组和UsersWorkgroup。 UsersWorkgroup存储用户在工作组中起什么作用。 以下是相关的代码片段:

@Entity
@Table(name = "users_workgroup")
public class UsersWorkgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected UsersWorkgroupPK usersWorkgroupPK;

    @JoinColumn(name = "idworkgroup", referencedColumnName = "idworkgroup")
    @ManyToOne(optional = false)
    private Workgroup workgroup;
    @JoinColumn(name = "user_name", referencedColumnName = "user_name")
    @ManyToOne(optional = false)
    private Users users;

    @Column(name = "role")
    private Integer role;


@Embeddable
public class UsersWorkgroupPK implements Serializable {

    @Basic(optional = false)
    @Column(name = "idworkgroup", insertable=false, updatable=false)
    private int idworkgroup;
    @Basic(optional = false)
    @Column(name = "user_name", insertable=false, updatable=false)
    private String userName;


@Entity
@Table(name = "workgroup")
public class Workgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idworkgroup")
    private Integer idworkgroup;
    @Column(name = "name")
    private String name;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idworkgroup")
    private Collection<UsersWorkgroup> usersWorkgroupCollection;

,当然,问题是,这是行不通的。 目前,我得到这个异常:

例外描述:不相容映射已经被[类entity.Workgroup]和[类entity.UsersWorkgroup]之间遇到。 这通常发生在一个映射的基数不与反向指针其的基数对应发生。

我不理解,因为一对多应符合多对一...或者是一个多对多的关系? 如果我切换到@ManyToMany,我得到这样的:

例外描述:关系属性[工作组]在类[类com.ericsson.rsg.ejb.entity.UsersWorkgroup]的目标实体不能被确定。 当不使用泛型,确保目标实体上的关系的映射来定义。

我想了解复合键(嵌入式),但所有我能找到的例子都只有简单的列不属于外键(但是这是一个复合键的整​​点,不是吗?)。 在UsersWorkgroup表可以秘密是一个连接表?

我要声明的PK类作为一个严格的POJO类? 或者我应该把@JoinColumn注解中的PK类? 如何引用列从另一个表中的复合键内? 我应该初始化在闯民宅类的构造函数的PK对象,或者是不是有必要?

我都觉得自己完全。

Answer 1:

首先,我认为你们的关系是多对多的,因为用户可以在许多组,一组可以有很多的用户(或我假设如此)。

其次,据我所知,你必须同时引用id_workgroup和USER_NAME为JoinColumns,因为他们是PK和一个单位的一部分,所以两者都应该被引用。

另外,我看到“等于”和“的hashCode”方法,从嵌入式PK失踪,还有getter / setter方法。 我相信他们是强制性的。



Answer 2:

你映射看起来除了精细mappedBy -它应该是一个属性名称,而不是列名:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workgroup") 
private Collection<UsersWorkgroup> usersWorkgroupCollection; 


文章来源: JPA Compound key with @EmbeddedId