是否有人知道如何使用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的集合。有誰知道我能做到這一點?