当前位置: 首页 > 知识库问答 >
问题:

在Java EE中使用JPA建模表关系

金英华
2023-03-14

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

group
----------
groupId    PK
name
user_account
----------
userId        PK
user_grouping
----------
groupId     PK    FK grouping(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;

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

SEVERE: Exception while preparing the app : Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] failed.
Internal Exception: Exception [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The @JoinColumns on the annotated element [field groupingList] from the entity class [class com.dv.model.entity.UserAccount] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
Local Exception Stack: 
Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] failed.
Internal Exception: Exception [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The @JoinColumns on the annotated element [field groupingList] from the entity class [class com.dv.model.entity.UserAccount] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:221)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1402)
...

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

共有1个答案

令狐钧
2023-03-14

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

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
}
 类似资料:
  • 问题内容: 我有以下实体关系问题。一个“游戏”必须有两个(只有两个)“团队”对象。一个“团队”可以有很多“游戏” 据我所知,这是一对多关系。但是…我不知道如何在JPA中对此建模。例如,我打算做这样的事情… 但是,正如您所看到的,我不确定如何从注释侧将表链接在一起。有人曾经做过这样的事情吗?有什么想法吗? 非常感谢! 问题答案: 我希望有人能提出一个很棒的解决方案,但是这是一个棘手的情况,我从未能找

  • 我将使用ADFS作为身份提供者(IDP)实现对java应用程序的单点登录。通过OneLogin找到了此解决方案SSO,并使用了其示例应用程序。除此之外,还有另一个解决方案Shibboleth。 我想知道与我的上下文匹配的最佳解决方案是什么。之间,这不是Spring应用程序。 谢谢

  • 我使用JPA创建一个表在内置的H2数据库的Wildfly 8.0安装使用Hibernate,但它失败了以下错误消息: 19:15:33,694WARN[org.hornetq.core.server](Thread-18(HornetQ-server-HornetQServerImpl::serverUUID=61b6684a-d6bb-11e4-926e-d9ecaa9f5457-1830325

  • 问题内容: 我有2张桌子: 电影:movieID 用户:userID 这些表通过Queue表具有多对多关系,并带有一个附加属性listOrder: 队列:movieID,userID,listOrder 我正在尝试使用EclipseLink对此模型建模,但是却收到“不兼容映射”错误。这是我的代码的示例: QueueItemPK的目的是使我可以拥有movieID和userID的复合主键。我不确定这是

  • 我正在尝试使用Hibernate/Jpa建立一对多关系。 当前我遇到以下异常: 退款交易。java这是父类 ItemRefundDetail.java这是子类。 我知道我在@OneToMany或@manytone注释中犯了一些错误。 更新:我在db、refund_transaction和item_refund_detail中只有2个表。我没有任何名为refund_transaction_item_

  • 我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体: