有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有两个相同类型字段的java JPA实体

我试图在我的实体中有两个相同域类的字段,但出现了以下错误:

org.hibernate.MappingException: Could not determine type for: com.packt.webapp.domain.User, at table: opinions, for columns: [org.hibernate.mapping.Column(author)]

我的实体:

@Entity
@Table(name="opinions")
public class Opinion {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @NotNull
    private String text;
    @NotNull
    private String date;
    @ManyToOne
    @JoinColumn(name="commented_user")
    private User writtenTo;
    private User author;

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String username;
    private String password;
    @OneToMany(mappedBy="writtenTo")
    private List<Opinion> opinions;

我只想把意见映射到评论用户和评论作者的author字段中。当我删除author字段时,一切正常。这个例子有什么问题


共 (3) 个答案

  1. # 1 楼答案

    它抱怨它不知道如何映射author字段。您可以提供类似于映射writtenTo的映射。一个观点有一个作者,一个作者可以写很多观点

    如果要忽略映射字段,请使用@Transient对其进行注释。瞬态注释防止该字段被持久化到数据库中,否则您必须像这样映射它:

    意见实体:

    @Entity
    @Table(name="opinions")
    public class Opinion {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
    
        @NotNull
        private String text;
    
        @NotNull
        private String date;
    
        @ManyToOne
        @JoinColumn(name="commented_user")
        private User writtenTo;
    
        // map author to User entity
        @ManyToOne
        @JoinColumn(name="authored_user")
        private User author;
    
        // getters and setters
    }
    

    用户实体:

    @Entity
    @Table(name="user")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
    
        private String username;
    
        private String password;
    
        @OneToMany(mappedBy="writtenTo")
        private List<Opinion> opinions;
    
        // map opinions to the author
        @OneToMany(mappedBy="author")
        private List<Opinion> authoredOpinions;
    
        // getters and setters
    }
    
  2. # 2 楼答案

    试着注释作者

    @ManyToOne
    @JoinColumn(name="author")
    private User author;
    
  3. # 3 楼答案

    只需在两个用户字段上应用@ManyToOne注释

    @ManyToOne
    @JoinColumn(name="commented_user")
    private User writtenTo;
    @ManyToOne
    @JoinColumn(name="author")
    private User author;
    

    但对于这样的问题,有一个更灵活的解决方案。用@ManyToMany替换@OneToMany和@manytomone关系。创建一个用户和一个角色实体(具有特定字段的实体具有子代)。一个用户可以扮演多个角色(作者、作者等),一个角色可以由多个用户扮演。在这种情况下,您可以改变主意,动态创建/删除/附加/分离角色,而无需更改现有表上的任何数据结构

    @Entity
    public class User
    {
      @Id
      private Long id;
      @Column
      private String name;
      @ManyToMany
      @JoinTable(
          name="User_Role",
          joinColumns=@JoinColumn(name="UserID", referencedColumnName="ID"),
          inverseJoinColumns=@JoinColumn(name="RoleID", referencedColumnName="ID"))
      private List<Role> roles;
    }
    
    @Entity
    public class Role
    {
      @Id
      private Long id;
      @Column
      private String name;
      @ManyToMany( mappedBy="roles" )
      private List<User> users;
    }
    

    您可以使用实用程序类通过角色ID/名称获取/检查用户角色:

    puclic class RoleUtility
    {
      public Role getUserRoleByName( User user_, String roleName_ )
      {
        User retRole = null;
        Iterator<Role> i = roles_.iterator();
        while ( ( retRole == null ) && i.hasNext() )
        {
          Role role = (Role) i.next();
          if ( roleName_.isEqual( role.getName ) )
            retRole = role;
        }
        return retRole;
      }
    }
    

    用于检查角色的客户端代码:

    User user = ...
    Role role = RoleUtility.getRoleByName( user.getRoles(), roleName );
    

    以您为例,使用此解决方案,您可以在不改变任何数据结构的情况下向意见或类似内容添加审查员/版主