2015-11-27 2 views
1

Я борюсь с моей структурой наследования, где у меня есть сопоставленный суперкласс, который содержит общее поле в конкретных классах. Этот суперкласс имеет сопоставление «один к одному» с объектом «обертка».Hibernate наследование сопоставление неизвестное свойство

Объекты выглядят так:

@Entity 
public class Wrapper { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "wrapper_id", nullable = false) 
    private Long wrapperId; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper") 
    @Cascade(CascadeType.SAVE_UPDATE) 
    private Base base; 

    public Long getWrapperId() { 
     return wrapperId; 
    } 

    public void setWrapperId(Long wrapperId) { 
     this.wrapperId = wrapperId; 
    } 

    public Base getBase() { 
     return base; 
    } 

    public void setBase(Base base) { 
     this.base = base; 
    } 

} 

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Base { 

    @OneToOne(fetch = FetchType.LAZY) 
    @Cascade(CascadeType.SAVE_UPDATE) 
    @JoinColumn(name = "wrapper_id") 
    protected Wrapper wrapper; 

    public Wrapper getWrapper() { 
     return wrapper; 
    } 

    public void setWrapper(Wrapper wrapper) { 
     this.wrapper = wrapper; 
    } 

} 

@Entity 
public class SubA extends Base { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "sub_a_id", nullable = false) 
    private Long subAId; 

    public Long getSubAId() { 
     return subAId; 
    } 

    public void setSubAId(Long subAId) { 
     this.subAId = subAId; 
    } 

} 

Для простоты я включил только один конкретный класс, но у меня есть несколько.

Это сопоставление отлично работает, когда у меня нет ссылки на «Base» в объекте-обертке. Как только я попытаюсь добавить двунаправленную связь между оболочкой и базой, я начинаю получать эту ошибку ... что не имеет смысла, поскольку поле есть.

Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: com.xxx.Wrapper.base, referenced property unknown: com.xxx.Base.wrapper 
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:153) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:453) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:438) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564) 
    ... 50 more 

Что мне не хватает? Спасибо,

+0

Какую версию 'hibernate' вы используете? – Andremoniy

+0

Мы используем 4.3.11.FINAL – gwnp

ответ

0

Мы закончили много прототипов с различными вариантами (отображенным суперклассом, иерархическим и т. Д.) И взвешивали варианты.

В итоге мы решили создать иерархию объектов в сочетании с аннотацией @Entity, стратегией наследования SINGLE_TABLE и использованием значений Disccriminator, чтобы дать нам именно то, что нам было нужно, не жертвуя слишком много.

Благодарим всех за ваши предложения.

3

Цитата Java Platform, Enterprise Edition: Java EE Tutorial:

37.2.2 Подключенные Superclasses

Объекты могут наследовать от суперкласса, которые содержат постоянное состояние и отображение информации но не являются сущностями. То есть суперкласс не украшен аннотацией @Entity и не отображается как объект поставщиком Java Persistence. Эти суперклассы самые часто используются, когда у вас есть информация о состоянии и сопоставлении, общая для нескольких классов сущностей. Подключенные суперклассы определяются декорирования класса с аннотацией javax.persistence.MappedSuperclass:

...

Подключенные суперклассы не могут быть запрошены и не могут быть использованы в EntityManager или запросов операций. Вы должны использовать подклассы объектов из сопоставленного суперкласса в EntityManager или Query. Mapped суперклассы не могут быть объектами отношений сущностей.

Так это выглядит, как вы не можете использовать этот базовый класс в отношениях сущностей:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper") 
@Cascade(CascadeType.SAVE_UPDATE) 
private Base base; 
+0

Речь идет не об этой проблеме.Если вы измените 'Base' на' SubA', ошибка все равно будет отображаться – Andremoniy

+0

@Andremoniy, когда я изменил Base на SubA в классе Wrapper, моя тестовая версия запускается без ошибок, так что это возможно по этой проблеме. – bary

+0

@ Но когда я это сделал, он не изменил поведение. Какую версию 'hibernate' вы используете? – Andremoniy