1

在旧数据库中,我有三个表:Users、Workgroups 和 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;

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

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

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

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

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

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

我觉得完全卡住了。

4

2 回答 2

1

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

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

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

于 2010-07-02T10:50:57.400 回答
0

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

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workgroup") 
private Collection<UsersWorkgroup> usersWorkgroupCollection; 
于 2010-07-02T11:04:33.537 回答