【发布时间】: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