我正在尝试确定是否有可能让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 映射抽象类似乎有点奇怪。我想念什么吗?
解
在rinds的帮助下设法解决了这个问题。需要注意两点:
1)抽象类需要使用@Entity和每个类的表继承策略进行注释,以使子类具有自己的表。
2)身份ID生成在这种情况下将不起作用,我不得不使用表生成类型。
@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 { ... }
是的,有可能。您应该只在顶部的抽象类上拥有MappedSuperClass(它本身不会持久化),并在实现类上添加Entity批注。
尝试将其更改为如下所示:
@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