0

我的数据库中有两个 3 表:

团体
----------
groupId PK
姓名
用户帐号
----------
用户 ID PK
用户分组
----------
groupId PK FK 分组(groupId -> groupId)
userId PK FK user_account(userId -> userId)

在我的 UserAccount 实体中,我有以下行:

@JoinTable(name = "user_group", joinColumns = {
    @JoinColumn(name = "userId", referencedColumnName = "userId")}, inverseJoinColumns = {
    @JoinColumn(name = "groupId", referencedColumnName = "groupId")})
@ManyToMany
private List<Grouping> groupingList;

这是为了显示所有表之间的关系。但是,当我部署时,我收到以下错误:

严重:准备应用程序时出现异常:异常 [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
异常描述:PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] 的预部署失败。
内部异常:异常 [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
异常说明:实体类 [class com.dv.model.entity.UserAccount] 中带注释的元素 [field groupingList] 上的 @JoinColumns 不完整。当源实体类使用复合主键时,必须使用@JoinColumns 为每个连接列指定@JoinColumn。name 和 referencedColumnName 元素都必须在每个这样的 @JoinColumn 中指定。
本地异常堆栈:
异常 [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
异常描述:PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] 的预部署失败。
内部异常:异常 [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
异常说明:实体类 [class com.dv.model.entity.UserAccount] 中带注释的元素 [field groupingList] 上的 @JoinColumns 不完整。当源实体类使用复合主键时,必须使用@JoinColumns 为每个连接列指定@JoinColumn。name 和 referencedColumnName 元素都必须在每个这样的 @JoinColumn 中指定。
    在 org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:221)
    在 org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1402)
...

我不确定如何解释此错误消息。我假设我没有在我的实体中正确建模表关系。但我不确定为什么。在今天之前,这编译得很好。任何人都可以提供帮助吗?

4

1 回答 1

0

表的描述不一致(分组与组)并且实体映射中的连接表名称不是表名称之一。由于这些不一致,我假设以下表结构:

useraccount (userid PK)
grouping (groupdid PK, name)
user_grouping (userId PK, groupId PK)
- FK userId references to user_account.userid
- FK groupId references to grouping.groupId

将其映射到两个实体的一种正确方法如下:

@Entity
public class UserAccount {
    @Id int userId;

    @JoinTable(name = "user_grouping", joinColumns = {
       @JoinColumn(name = "userId", referencedColumnName = "userId")},
       inverseJoinColumns = {
       @JoinColumn(name = "groupId", referencedColumnName = "groupId")})
       @ManyToMany
       private List<Grouping> groupingList;
    //get and set omitted.
}

@Entity
public class Grouping {
    @Id int groupId;
    String name;
    //get,set, and optional inverse side of relationship omitted
}
于 2012-06-14T18:48:26.527 回答