1

我正在为我的继承结构而苦苦挣扎,其中我有一个映射的超类,其中包含具体类中的一个公共字段。这个超类具有与“包装”对象的一对一映射。

对象看起来像这样;

@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

我错过了什么?谢谢,

4

3 回答 3

3

引用 Java Platform, Enterprise Edition:Java EE 教程:

37.2.2 映射的超类

实体可以从包含持久状态和映射信息但不是实体的超类继承。也就是说,超类没有用@Entity 注释修饰,也没有被Java Persistence 提供者映射为实体。当您拥有多个实体类共有的状态和映射信息时,最常使用这些超类。映射的超类是通过使用注释 javax.persistence.MappedSuperclass 装饰类来指定的:

...

映射的超类不能被查询,也不能在 EntityManager 或 Query 操作中使用。您必须在 EntityManager 或 Query 操作中使用映射超类的实体子类。映射的超类不能成为实体关系的目标。

所以看起来你不能在实体关系中使用这个基类:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper")
@Cascade(CascadeType.SAVE_UPDATE)
private Base base;
于 2015-11-27T14:25:23.357 回答
0

看起来像这个hibernate错误:当映射双向 OneToOne 关系与派生标识符时,Hibernate 抱怨未知的 mappedBy 属性,该问题仅在 hibernate 4.2.2、4.3.0.Beta3 后期版本中修复。

于 2015-11-27T14:32:00.463 回答
0

我们最终用不同的选项(映射的超类、分层等)做了很多原型设计,并权衡了这些选项。

最后,我们决定创建对象层次结构,并结合@Entity 注释、SINGLE_TABLE 的继承策略和使用鉴别器值来准确地为我们提供我们需要的东西,而不会牺牲太多。

谢谢大家的建议。

于 2015-12-21T03:00:50.373 回答