我正在尝试解决是否可能让JPA持久化具体实现的抽象集合。
到目前为止,我的代码看起来像这样:
@Entity
public class Report extends Model {
@OneToMany(mappedBy = "report",fetch=FetchType.EAGER)
public Set<Item> items;
}
@MappedSuperclass
public abstract class OpsItem extends Model {
@ManyToOne
public RetailOpsBranch report;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BItem extends OpsItem {
...
}
但我一直在绊倒下面的映射错误,我真的不知道这是否可行?
JPA error
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem]
更新
我认为问题不在于抽象类,而在于 @MappedSuperClass 注释。 看起来jpa不喜欢用 @MappedSuperClass 映射一对多的关系。 如果我将抽象类更改为具体类,则会出现相同的错误。
如果我改为 @Entity 注释,这似乎适用于抽象类和具体类。
使用 @Entity 映射抽象类似乎有点奇怪。 我错过了什么?
解
在rhinds的帮助下管理它。 需要注意两点:
1)抽象类需要使用@Entity和每个类的表的继承策略进行注释,以便子类拥有自己的表。
2)Identity Id生成在这种情况下不起作用,我不得不使用Table生成类型。
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class OpsItem extends GenericModel {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public Long id;
public String branchCode;
@ManyToOne
public Report report;
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
答案 0 :(得分:6)
尝试将其更改为以下内容:
@MappedSuperclass
public abstract class OpsItem extends Model {
@ManyToOne
public RetailOpsBranch report;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BItem extends OpsItem {
...
}
查看hibernate文档的这一部分,了解其使用的详细信息:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168
<强>更新强>
对不起,每个课程完全错过了表格。 Hibernate不支持每个类的表抽象对象的映射(如果所有实现都在一个SQL表中,则只能映射List,而TABLE_PER_CLASS使用“每个具体类的表”策略。
限制和策略的详细信息:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#inheritance-limitations