【问题标题】:Modeling Table Relationships using JPA in Java EE在 Java EE 中使用 JPA 对表关系进行建模
【发布时间】:2012-06-17 19:27:07
【问题描述】:

我的数据库中有两个 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) ...

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

【问题讨论】:

  • 你的代码不一致。是 user_group 还是 user_grouping?什么是分组实体?一个小组?所涉及的两个实体的映射是什么?

标签: java jakarta-ee jpa glassfish


【解决方案1】:

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

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
}

【讨论】:

  • 您对表结构的假设是正确的。当我试图让它成为一个更简单的例子时,我把一些名字弄乱了。但是,唯一的事情是,您对 UserAccount 实体所拥有的正是我在对问题的描述中所拥有的。这就是给我带来问题的原因。
  • 这很奇怪,我刚刚使用 EclipseLink 2.3.2 对其进行了测试,它对我来说没有问题。您也许可以编辑您的问题以包含所有映射(包括可能的反向关系)以进行进一步调试。
猜你喜欢
  • 2014-04-14
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2014-09-08
相关资源
最近更新 更多