在传统的数据库中,我有三个表:用户,工作组和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对象,或者是不是有必要?
我都觉得自己完全。