有没有人知道如何使用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的集合。有谁知道我怎么能做到这一点?
答案 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;