我在使用Hibernate时遇到错误:
org.hibernate.AnnotationException: mappedBy reference
an unknown target entity property: ch.zkb.documenz.backend.model.Template.user
in ch.zkb.documenz.backend.model.User.templates
我有两个表:用户和模板,但在模板中,我需要使用用户的id:createdBy,lockBy或lastUpdateBy,我想我必须在我的例子中使用@onetomany,但它是&# 39;不正确,那么最好的做法是什么?
public class User implements Serializable {
@Id
@Column(name = "user_id", unique = true, nullable = false)
private Long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private Set<Template> templates;
public class Template implements Serializable {
@Id
@Column(name = "template_id", unique = true, nullable = false)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "createdBy")
private User createdBy;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "lastUpdateBy")
private User lastUpdateBy;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "lockBy")
private User lockBy;
编辑,我现在遇到双向LAZY加载问题,我想让用户创建模板,但我不能......总是为NULL,但是在DB中正确存储
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "createdBy")
private Set<Template> createdTemplates;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "createdBy", referencedColumnName = "user_id", nullable = false)
private User createdBy;
答案 0 :(得分:0)
你可以单独映射到你的私钥,然后在瞬态方法中你可以合并它们。
private Set<Template> templates = new HasSet<Template>();
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "createdBy")
private Set<Template> createdByTemplates;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "lastUpdateBy")
private Set<Template> lastUpdateByTemplates;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "lockBy")
private Set<Template> lockByTemplates;
@Transient
public Set<Template> getTemplates(){
if(getCreatedByTemplates() != null){
templates.addAll(getCreatedByTemplates());
}
if(getLockByTemplates() != null){
templates.addAll(getLockByTemplates());
}
if(getLastUpdateByTemplates() != null){
templates.addAll(getLastUpdateByTemplates());
}
return templates;
}
答案 1 :(得分:0)
关于什么不起作用的异常消息很清楚,mappedBy必须引用你在另一个实体中拥有的属性名, 在你的模板实体中,没有名为&#34; user&#34;的属性,尝试删除mappedBy。
答案 2 :(得分:0)
我相信map by正在模板中寻找bean名称“user”。
public class User implements Serializable {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private Set<Template> templates;
public class Template implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
更改是变量名称 由模板类中的用户创建