2016-02-24 2 views
0

У меня есть ошибка с Hibernate:@OneToMany неопределенная объект недвижимости, с несколькими @ManyToOne у детей Entity

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 

У меня есть две таблицы: пользователя и шаблон, но в шаблоне нужно использовать идентификатор пользователь в: createdBy, lockBy или lastUpdateBy, я думаю, что мне нужно использовать @onetomany, как в моем примере, но что-то не так, что лучше для этого?

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; 

EDIT, у меня сейчас проблема с нагрузкой Двунаправленный ленивым, я хочу, чтобы пользователь горе создал шаблон, но я не могу .. всегда NULL, но в БД хранится правильно

@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

Вы должны отнестись к своим личным ключам отдельно, а затем в переходном методе вы можете объединить их.

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; 
} 
+0

sgpalit, теперь я могу^т нагрузка в режиме ленивого CreatedBy от шаблона объекта, вы можете увидеть код в главный вопрос, в разделе EDIT у меня нет исключений или ошибок .. – Miofino

0

Сообщение об исключении ясно о том, что не работает, mappedBy должен ссылаться на имя атрибута, которое вы имеете в другой организации, в шаблоне сущности нет атрибута с именем «пользователь», попробуйте для удаления сопоставленного.

+0

Спасибо winmiden, вы правы, но теперь у меня проблема с LAZY LOAD, в моем посте вы можете увидеть мое новое сопоставление, знаете ли вы, что это проблема, у меня нет ошибки, только пользовательский объект NULL – Miofino

0

Я верю, что отображается на bean name "user" в Template.

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; 

Изменение имени переменной CreatedBy к пользователю в классе Template поможет

+0

спасибо за помощь, мне понравилось, что вы сказали мне, но теперь у меня есть проблема с LAZY, когда я хочу получить User createdBy, всегда NULL, где проблема? – Miofino

+0

Вы выбираете «Пользователь» родителя или «Шаблона» ребенка? –

Смежные вопросы