【问题标题】:Hibernate inheritance mapping unknown propertyHibernate继承映射未知属性
【发布时间】:2015-11-27 14:11:04
【问题描述】:

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

物体看起来像这样;

@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

我错过了什么? 谢谢,

【问题讨论】:

  • 你使用什么版本的hibernate
  • 我们使用的是 4.3.11.FINAL

标签: java hibernate inheritance one-to-one mappedsuperclass


【解决方案1】:

引用自 Java 平台企业版: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;

【讨论】:

  • 这与这个问题无关。如果您将Base 更改为SubA 仍然会出现错误
  • @Andremoniy,当我在 Wrapper 类中将 Base 更改为 SubA 时,我的测试用例运行没有错误,所以这可能与这个问题有关。
  • @但是当我这样做时,它并没有改变行为。你用的是哪个版本的hibernate
  • @Andremoniy 我在 4.3.11.Final 上检查过
  • 在这个版本中修复了这个错误
【解决方案2】:

看起来像这样的hibernate 错误:Hibernate complains about an unknown mappedBy property when mapping a bidirectional OneToOne relation with a derived identifier,仅在后期休眠 4.2.2、4.3.0.Beta3 版本中修复。

【讨论】:

    【解决方案3】:

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

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

    谢谢大家的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-23
      • 2017-12-07
      • 2011-11-22
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多