簡體   English   中英

具有兩個相同類型字段的JPA實體

[英]JPA Entity with two fields of the same type

我試圖在我的實體中使用同一域類的2個字段,但出現此錯誤:

org.hibernate.MappingException:無法確定以下類型:com.packt.webapp.domain.User,在表:意見,針對列:[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字段時,一切正常。 這個例子怎么了?

嘗試注釋作者嗎?

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

它抱怨說它不知道如何映射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
}

只需在兩個User字段上應用@ManyToOne批注。

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

但是,對於此類問題,存在更靈活的解決方案。 用@ManyToMany替換@OneToMany和@ManyToOne關系。 創建一個用戶和一個角色實體(帶有特定字段的后代)。 一個用戶可以有許多角色(作家,作者等),而一個角色可以由許多用戶扮演。 在這種情況下,您可以改變主意並動態創建/刪除/附加/分離角色,而無需更改現有表上的任何數據結構。

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

在這個解決方案的例子中,您可以在不改變任何數據結構的情況下,將意見檢查者/主持人添加到意見或類似內容中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM