如何映射来自同一层次各子类的集合到一个所属的类?(How to map collection of

2019-08-02 12:23发布

有谁知道如何每个子类的集合同一层级映射到一个所属的类,使用JPA 2.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
    @DiscriminatorValue("SubClassOne")
    public class SubClassOne extends MySuperClass {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner")
    private Owner owner;

    @Entity
    @DiscriminatorValue("SubClassTwo")
    public class SubClassTwo extends MySuperClass {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner")
    private Owner owner;

这一切都看起来很好,当我坚持的对象,我可以看到他们进入与正确的鉴别数据库,以及权利人。

这里是我的“所属”类 - 没有什么特别的注释:

@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;
...

2.列表,收藏品有干将。 当我打电话getSubClassOnes(),我得到所有相关实体的袋子回来,类型SubClassOne,甚至包括那些在数据库中SubClassTwo鉴别。 当我打电话getSubClassTwos(),我得到什么似乎是SubClassTwos的袋子,但是,当我遍历在运行时集合,炸毁

org.hibernate.WrongClassException:对象ID为:gM4pnnoRge4Odx4lUTZNMQ不是指定的子类:my.package.SubClassTwo(装载的对象是错误的类的类my.package.SubClassOne的)在org.hibernate.loader.Loader.instanceAlreadyLoaded(装载机。的java:1420)[休眠核-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)[冬眠核-4.0.0.Final.jar:4.0.0.Final]在org.hibernate作为。 loader.Loader.doQuery(Loader.java:856)[休眠核-4.0.0.Final.jar:4.0.0.Final]在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)[休眠-core-4.0.0.Final.jar:4.0.0.Fin在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)[冬眠核-4.0.0.Final.jar:4.0.0。翅片在org.hibernate.loader.Loader.loadCollection(Loader.java:2175)[冬眠核-4.0.0.Final.jar:4.0.0.Final]在有机 .hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:61)[冬眠核-4.0.0.Final.jar:4.0.0.F在org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister。的java:622)[休眠 - 共在org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEvent在org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1606)[hibernate-core-4.0.0.Final。罐子:4.0.0.Final]在org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:379)[冬眠-C在org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112) [冬眠芯-4。 在org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)[冬眠核-4.0.0.Final.jar:4.0.0.Final]

我想发生的是,getSubClassOnes()返回一个包含与类SubClassOnes所有者相关联的一个集合,getSubClassTwos()返回有关SubClassTwos的集合。 有谁知道我能做到这一点?

Answer 1:

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

@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;


文章来源: How to map collection of each subclass from same hierarchy onto one owning class?