4

これが私のクラス構造です:

class A
class B extends A
class C extends A
class D extends C
class E extends C

そして、これが私のマッピングです(簡潔にするためにクラス本体は省略されています):

クラスA:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@MappedSuperclass
@DiscriminatorColumn(
        name="className",
        discriminatorType=DiscriminatorType.STRING
)
@ForceDiscriminator
public abstract class A

クラスB:

@Entity
@DiscriminatorValue("B")
public class B extends A

クラスC:

@Entity
@DiscriminatorValue("C")
@MappedSuperclass
@DiscriminatorColumn(
        name="cType",
        discriminatorType=DiscriminatorType.STRING
)
@ForceDiscriminator
public abstract class C extends A

クラスD:

@Entity
@DiscriminatorValue("D")
public class D extends C

クラスE:

@Entity
@DiscriminatorValue("E")
public class E extends C

Aのセットを含むクラスFがあります。

@Entity
public class F
{
    ...

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @JoinTable(
            name="F_A",
            joinColumns = @JoinColumn(name="A_ID"),
            inverseJoinColumns = @JoinColumn(name="F_ID")
    )
    private Set<A> aSet = new HashSet<A>();

    ...

問題は、新しいEインスタンスをaSetに追加してから呼び出すたびにsession.saveOrUpdate(fInstance)、hibernateがディスクリミエーター文字列として「A」を付けて保存することです。FインスタンスでaSetにアクセスしようとすると、次の例外が発生します(簡潔にするために完全なスタックトレースは省略されています)。

org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A

クラスを間違ってマッピングしていますか?複数レベルの継承をどのようにマッピングする必要がありますか?

助けてくれてありがとう!

4

1 に答える 1

3

私は解決策を見つけたので、他の誰かがこの問題に遭遇した場合に備えて、ここに投稿すると思います。

クラスCの余分な注釈が問題の原因であることが判明しました。エンティティ以外のすべてを取り除き、他のすべてのクラスを(適切な識別子の値を使用して)そのままにしておくと、すべてが正しく機能しました。

@Entity
public class C extends A
...
于 2010-05-20T20:15:37.593 に答える