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