【问题标题】:JPA Compound key with @EmbeddedId带有 @EmbeddedId 的 JPA 复合键
【发布时间】:2010-07-02 08:31:20
【问题描述】:

在旧数据库中,我有三个表:Users、Workgroups 和 UsersWorkgroup。 UsersWorkgroup 存储用户在工作组中的角色。 以下是相关代码sn-ps:

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

当然,问题是,它不起作用。 目前我得到这个例外:

异常描述:不兼容 之间遇到了映射 [class entity.Workgroup] 和 [class 实体.UsersWorkgroup]。这通常 当 a 的基数发生时 映射不对应 其反向指针的基数。

我不明白,因为 OneToMany 应该匹配 ManyToOne... 或者它是 ManyToMany 关系?如果我切换到@ManyToMany,我会得到这个:

异常描述:目标 关系属性的实体 [工作组] 上类 [类 com.ericsson.rsg.ejb.entity.UsersWorkgroup] 无法确定。不使用时 泛型,确保目标实体是 在关系映射上定义。

我正在尝试理解复合键(嵌入式),但我能找到的所有示例都只有简单的列,而不是外键(但这就是复合键的全部意义,不是吗?)。 UsersWorkgroup 表可以偷偷做一个联接表吗?

我应该将 PK 类声明为严格的 POJO 类吗?还是应该将@JoinColumn 注释放在PK 类中?如何从另一个表中引用复合键中的列?我应该在引用类构造函数中初始化PK对象,还是不需要?

我感觉完全被卡住了。

【问题讨论】:

    标签: java jpa jpa-2.0 compound-key


    【解决方案1】:

    首先,我认为您的关系是多对多的,因为一个用户可以在多个组中,而一个组可以有多个用户(或者我会假设如此)。

    其次,据我所知,您必须将 id_workgroup 和 user_name 都引用为 JoinColumns,因为它们是 PK 的一部分和一个单元,因此两者都应该被引用。

    另外,我发现嵌入式 PK 以及 getter/setter 中缺少“equals”和“hashCode”方法。我相信它们是强制性的。

    【讨论】:

      【解决方案2】:

      您的映射看起来不错,除了 mappedBy - 它应该是属性名称,而不是列名称:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2019-03-16
        • 2014-05-28
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多