これが私のクラス構造です:
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
クラスを間違ってマッピングしていますか?複数レベルの継承をどのようにマッピングする必要がありますか?
助けてくれてありがとう!