具有两个相同类型字段的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
字段时,一切正常。这个例子有什么问题
# 1 楼答案
它抱怨它不知道如何映射
author
字段。您可以提供类似于映射writtenTo
的映射。一个观点有一个作者,一个作者可以写很多观点如果要忽略映射字段,请使用
@Transient
对其进行注释。瞬态注释防止该字段被持久化到数据库中,否则您必须像这样映射它:意见实体:
用户实体:
# 2 楼答案
试着注释作者
# 3 楼答案
只需在两个用户字段上应用@ManyToOne注释
但对于这样的问题,有一个更灵活的解决方案。用@ManyToMany替换@OneToMany和@manytomone关系。创建一个用户和一个角色实体(具有特定字段的实体具有子代)。一个用户可以扮演多个角色(作者、作者等),一个角色可以由多个用户扮演。在这种情况下,您可以改变主意,动态创建/删除/附加/分离角色,而无需更改现有表上的任何数据结构
您可以使用实用程序类通过角色ID/名称获取/检查用户角色:
用于检查角色的客户端代码:
以您为例,使用此解决方案,您可以在不改变任何数据结构的情况下向意见或类似内容添加审查员/版主