@OneToMany未知的目标实体属性,在子实体中有几个@ManyToOne实体

时间:2016-02-24 11:23:56

标签: java hibernate jpa

我在使用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;

3 个答案:

答案 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;

更改是变量名称 由模板类中的用户创建