2

是否有人知道如何使用JPA 2.0註釋將每個子類的集合從同一層次映射到一個擁有類,使用Hibernate 4.0.0.Final支持的JPA 2.0註釋?如何將每個子類的集合從同一層次映射到一個擁有類中?

位錯綜複雜,所以這裏是一個例子。層次結構類看起來是這樣的:


    @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) at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1420)[hibernate-core-4.0 .0.Final.jar:4.0.0.Final] at org.hibernate.loader.Loader.getRow(Loader.java:1373)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:640)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] at org.h ibernate.loader.loader.doQuery(Loader.java:856)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289 )[hibernate-core-4.0.0.Final.jar:4.0.0.Fin at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)[hibernate-core-4.0.0.Final.jar: 4.0.0.Fin at org.hibernate.loader.Loader.loadCollection(Loader.java:2175)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] at org.hibernate.loader。 collection.CollectionLoader.initialize(CollectionLoader.java:61)[hibernate-core-4.0.0.Final.jar:4.0.0.F at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:622) [hibernate-co at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onIni tializeCollection(DefaultInitializeCollectionEvent at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1606)[hibernate-core-4.0.0.Final.jar:4.0.0.Final] at org.hibernate.collection.internal。 AbstractPersistentCollection.java:379 [hibernate-c at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112)[hibernate-core-4。 在org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)[休眠 - 核心4.0.0.Final.jar:4.0.0.Final]

我想什麼要發生的是getSubClassOnes()返回包含與類SubClassOnes的所有者關聯的集合,並且getSubClassTwos()返回一個包含相關SubClassTwos的集合。有誰知道我能做到這一點?

回答

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; 
相關問題