我正在努力继承我的继承结构,我有一个映射的超类,它包含具体类中的公共字段。这个超类与一个"包装器#34;进行一对一的映射。宾语。
对象看起来像这样;
undef
为简单起见,我只包括一个具体的课程,但我有几个。
当我没有引用" Base"在包装器对象中。一旦我尝试添加包装器和基座之间的双向关系,我就会开始出现这个错误......当字段存在时,它没有意义。
@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;
}
}
我错过了什么? 谢谢,
答案 0 :(得分:3)
引用Java平台企业版:Java EE教程:
37.2.2映射超类
实体可以从包含持久状态的超类继承 和映射信息但不是实体。也就是说,超类 未使用@Entity注释进行修饰,并且未将其映射为 Java Persistence提供者提供的实体。这些超类是最多的 通常在您拥有常见的状态和映射信息时使用 多个实体类。映射的超类由。指定 用注释装饰类 javax.persistence.MappedSuperclass:
...
无法查询映射的超类,也无法使用 EntityManager或Query操作。您必须使用的实体子类 EntityManager或Query操作中映射的超类。的映射 超类不能成为实体关系的目标。
所以看起来你不能在实体关系中使用这个Base类:
@OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper")
@Cascade(CascadeType.SAVE_UPDATE)
private Base base;
答案 1 :(得分:0)
看起来像这个hibernate
错误:Hibernate complains about an unknown mappedBy property when mapping a bidirectional OneToOne relation with a derived identifier,仅在hibernate 4.2.2,4.3.0.Beta3版本中修复。