如何将同一层次结构中每个子类的集合映射到一个拥有的类?

时间:2012-11-08 18:14:44

标签: java jpa-2.0 single-table-inheritance class-table-inheritance

有没有人知道如何使用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个List集合有getter。当我调用getSubClassOnes()时,我得到了一包所有关联的实体,类型为SubClassOne,甚至是那些在数据库中具有SubClassTwo鉴别器的实体。当我调用getSubClassTwos()时,我得到的东西似乎是一包SubClassTwos,但是当我在运行时迭代集合时,会爆炸

  

org.hibernate.WrongClassException:具有id的对象:gM4pnnoRge4Odx4lUTZNMQ不是指定的子类:my.package.SubClassTwo(加载的对象是错误的类class 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-co         at 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]

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

1 个答案:

答案 0 :(得分:0)

对于我们来说,这是通过将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;