【问题标题】:Mapping JPA entity relationships映射 JPA 实体关系
【发布时间】:2012-01-17 11:12:13
【问题描述】:

我想要一些关于如何最好地布局我的 JPA 实体类的建议。假设我有 2 个表我想建模为实体、用户和角色。

Create Table users(user_id primary key,
                   role_id integer not null )
Create table role(role_id primary key,
                  description text,
                  )

我创建了以下两个 JPA 实体:

@Entity
@Table(name="users")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
      private Long userId;
      private Long roleId;
      private Role role;

      @Column(name = "user_id")
      @Id
      public Long getUserId() {}

     @Column(name = "role_id")
      public Long getRoleId() {}

      @ManyToOne()
      JoinColumn(name="role_id")
      public Role getRole() {}
}

角色实体:

@Entity
@Table(name="Role")
@Access(AccessType.PROPERTY)
public class Role implements Serializable {
      private String description;
      private Long roleId;


      @Column(name = "role_id")
      @Id
      public Long getRoleId() {}

     @Column(name = "description")
      public Long getDescrition(){}

      @ManyToOne()
      @JoinColumn(name="role_id")
      public Role getRole() {}
}

建模这种关系的正确方法是如上所述,还是我会放弃私有 Long roleId;在用户?欢迎任何建议。 当我以这种方式映射时,我收到以下错误:

 org.hibernate.MappingException: Repeated column in mapping for entity:

【问题讨论】:

  • 你真的想限制你的用户只有一个(或没有)Role吗?
  • @Role。在这个应用程序中,是的,他们应该只有 1 个角色。

标签: jpa


【解决方案1】:

是的,当您在同一列上有 @ManyToOne 时,您将删除 private Long roleId 映射。

正如错误所暗示的,您只能将@Entity 中的每一列映射一次。由于role_id@ManyToOne 引用的@JoinColumn,因此您不能也将其映射为属性。

但是,您可以添加一个方便的方法来返回角色 ID,例如

 public Long getRoleId() {
   return role.getId();
 }

【讨论】:

  • 也 - 不是问题的一部分,但默认情况下您可能不需要 @Access 修饰符
  • 谢谢。当我放弃私有 Long roleId 时,一切似乎都运行良好。我只是不知道我是否应该,因为它在后端数据库表中。但我想这样做是可以接受的。
猜你喜欢
  • 2011-02-14
  • 2011-07-13
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2015-10-03
  • 2019-03-27
相关资源
最近更新 更多