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

时间:2017-03-27 21:14:31

标签: java spring hibernate jpa

我尝试在我的实体中拥有相同域类的2个字段,并且我收到此错误:

  

org.hibernate.MappingException:无法确定:com.packt.webapp.domain.User的类型,在表:views,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 个答案:

答案 0 :(得分:2)

尝试注释作者吗?

getDeviceList()

答案 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 :(得分:0)

只需在用户字段中应用@ManyToOne注释。

paramType

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

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

您可以使用实用程序类按角色ID /名称来检查/检查用户角色:

@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;
}

检查角色的客户端代码:

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;
  }
}

使用此解决方案留下您的示例,您可以在没有任何数据结构更改的情况下向审核或类似内容添加审核员/审核者。