Java 如何将同一层次结构中每个子类的集合映射到一个所属类上?

Java 如何将同一层次结构中每个子类的集合映射到一个所属类上?,java,jpa-2.0,single-table-inheritance,class-table-inheritance,Java,Jpa 2.0,Single Table Inheritance,Class Table Inheritance,有人知道如何使用JPA2.0注释,在Hibernate 4.0.0.Final的支持下,将同一层次结构中的每个子类的集合映射到一个拥有的类上吗 有点复杂,所以这里有一个例子。层次结构类如下所示: @Entity @Cacheable(true) @Table(name = "hierarcicals") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(nam

有人知道如何使用JPA2.0注释,在Hibernate 4.0.0.Final的支持下,将同一层次结构中的每个子类的集合映射到一个拥有的类上吗

有点复杂,所以这里有一个例子。层次结构类如下所示:


    @Entity
    @Cacheable(true)
    @Table(name = "hierarcicals")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "class", discriminatorType = DiscriminatorType.STRING)
    public abstract class MySuperClass {
    ...
这一切看起来都很好,当我持久化对象时,我可以看到它们以正确的鉴别器和正确的所有者进入数据库

这是我的“拥有”类-其注释没有什么特别之处:

@Entity
@Cacheable(true)
@Table(name = "owner")
public class Owner  {
...
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassTwo> subClassTwos;
...
@实体
@可缓存(真)
@表(name=“owner”)
公共类所有者{
...
@OneToMany(mappedBy=“owner”,fetch=FetchType.LAZY)
私有列表子类群;
@OneToMany(mappedBy=“owner”,fetch=FetchType.LAZY)
私有列表子类2;
...

这两个列表集合都有getter。当我调用getSubassones()时,我会得到一包所有关联的实体,比如类型Subassone,甚至是那些在数据库中有SubClassTwo鉴别器的实体。当我调用getSubClassTwos()时,我得到的似乎是一包子类,但当我在运行时迭代集合时,它会与

org.hibernate.ErrorClassException:id为GM4PNORGE4ODX4LUTZNMQ的对象不属于指定的子类:my.package.SubClassTwo(加载的对象属于错误的类my.package.SubClassOne) 在org.hibernate.loader.loader.instanceAlreadyLoaded(loader.java:1420)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.loader.loader.getRow(loader.java:1373)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.loader.loader.getRowFromResultSet(loader.java:640)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.loader.loader.doQuery(loader.java:856)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:289)[hibernate-core-4.0.0.Final.jar:4.0.0.Fin 在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:259)[hibernate-core-4.0.0.Final.jar:4.0.0.Fin 在org.hibernate.loader.loader.loadCollection(loader.java:2175)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:61)[hibernate-core-4.0.0.Final.jar:4.0.0.F 在org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:622)[hibernate公司 位于org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEvent 在org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1606)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] 在org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:379)[hibernate-c] 在org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112)[hibernate-core-4。 在org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)[hibernate-core-4.0.0.Final.jar:4.0.0.Final]


我希望发生的是,getSubassones()返回一个集合,其中包含与具有类Subassones和getSubasstwos()的所有者相关联的集合返回一个包含相关子类2的集合。有人知道我如何实现这一点吗?

对于我们来说,这是通过向
@OneToMany
注释添加
targetEntity
属性来解决的,指向超类,如下所示:

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassTwo> subClassTwos;
@OneToMany(mappedBy=“owner”,fetch=FetchType.LAZY,targetEntity=MySuperClass.class)
私有列表子类群;
@OneToMany(mappedBy=“owner”,fetch=FetchType.LAZY,targetEntity=MySuperClass.class)
私有列表子类2;
@Entity
@Cacheable(true)
@Table(name = "owner")
public class Owner  {
...
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassTwo> subClassTwos;
...
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassTwo> subClassTwos;