Hibernate 映射中 2 级继承的问题
这是我的类结构:
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>();
...
问题是每当我向 aSet 添加一个新的 E 实例然后调用 session.saveOrUpdate(fInstance) 时,hibernate 都会使用“A”作为鉴别器字符串进行保存。当我尝试访问 F 实例中的 aSet 时,出现以下异常(为简洁起见,省略了完整的堆栈跟踪):
org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A
我是否错误地映射了类?我应该如何映射多个继承级别?
感谢您的帮助!
Here's my class structure:
class A
class B extends A
class C extends A
class D extends C
class E extends C
And here are my mappings (class bodies omitted for brevity):
Class A:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@MappedSuperclass
@DiscriminatorColumn(
name="className",
discriminatorType=DiscriminatorType.STRING
)
@ForceDiscriminator
public abstract class A
Class B:
@Entity
@DiscriminatorValue("B")
public class B extends A
Class C:
@Entity
@DiscriminatorValue("C")
@MappedSuperclass
@DiscriminatorColumn(
name="cType",
discriminatorType=DiscriminatorType.STRING
)
@ForceDiscriminator
public abstract class C extends A
Class D:
@Entity
@DiscriminatorValue("D")
public class D extends C
Class E:
@Entity
@DiscriminatorValue("E")
public class E extends C
I've got a class F that contains a set of A:
@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>();
...
The problem is that whenever I add a new E instance to aSet and then call session.saveOrUpdate(fInstance)
, hibernate saves with "A" as the discrimiator string. When I try to access the aSet in the F instance, I get the following exception (full stacktrace ommitted for brevity):
org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: path.to.class.A
Am I mapping the classes incorrectly? How am I supposed to map multiple levels of inheritance?
Thanks for the help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我找到了一个解决方案,所以我想我会将其发布在这里,以防其他人遇到这个问题。
事实证明,C 类上的额外注释导致了该问题。当我摆脱除实体之外的所有内容并将所有其他类保留原样(具有适当的鉴别器值)时,一切正常。
I found a solution, so I guess I'll post it here in case anyone else runs across this problem.
It turns out that the extra annotations on class C were causing the problem. When I got rid of everything but entity and left all the other classes the way they were (with the appropriate discriminator values), everything worked correctly.