Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate继承映射未知属性_Java_Hibernate_Inheritance_One To One_Mappedsuperclass - Fatal编程技术网

Java Hibernate继承映射未知属性

Java Hibernate继承映射未知属性,java,hibernate,inheritance,one-to-one,mappedsuperclass,Java,Hibernate,Inheritance,One To One,Mappedsuperclass,在继承结构中,我有一个映射的超类,它在具体类中包含一个公共字段。这个超类有一个与“包装器”对象的一对一映射 物体看起来像这样 @Entity public class Wrapper { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "wrapper_id", nullable = false) private Long wrapperId; @OneToOne(fe

在继承结构中,我有一个映射的超类,它在具体类中包含一个公共字段。这个超类有一个与“包装器”对象的一对一映射

物体看起来像这样

@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
我错过了什么?
谢谢,

引用Java平台,企业版:Java EE教程:

37.2.2映射超类

实体可以从包含持久状态的超类继承 和映射信息,但不是实体。也就是说,超类 未使用@Entity注释修饰,也未映射为 由Java持久性提供程序创建的实体。这些超类是最重要的 通常在您拥有通用的状态和映射信息时使用 多个实体类。映射的超类由 用注释装饰类 javax.persistence.MappedSuperclass:

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

因此,看起来您无法在实体关系中使用此基类:

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

看起来像这样的
hibernate
bug:,它只在hibernate 4.2.2、4.3.0.Beta3的后期版本中被修复。

我们最后用不同的选项(映射的超类、层次结构等)做了大量的原型设计,并权衡了这些选项

最后,我们决定创建对象层次结构,再加上@Entity注释、单_表的继承策略,并使用鉴别器值为我们提供所需的内容,而不会牺牲太多


谢谢大家的建议。

这与这个问题无关。如果将
Base
更改为
SubA
错误仍将存在appear@Andremoniy,当我在包装类中将Base改为SubA时,我的测试用例运行没有错误,所以这很可能与这个问题有关。@但当我这样做时,它没有改变行为。你使用哪个版本的
hibernate
呢?@Andremoniy我在4.3.11上检查了它。最后这个版本这个错误被修复了。你使用哪个版本的
hibernate
呢?我们使用的是4.3.11.FINAL