2

有谁知道如何使用由 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 List 集合具有吸气剂。当我调用 getSubClassOnes() 时,我得到一袋所有关联实体,作为 SubClassOne 类型,即使是那些在数据库中具有 SubClassTwo 鉴别器的实体。当我调用 getSubClassTwos() 时,我得到似乎是一袋 SubClassTwos,但是当我在运行时迭代集合时,它会爆炸

初始化(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) [hibernate-core-4.0.0.Final.jar:4.0.0.Final]

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

4

1 回答 1

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;
于 2014-10-15T08:36:16.677 回答