[英]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.