Hibernate 映射中 2 级继承的问题

发布于 2024-09-02 04:20:45 字数 1641 浏览 9 评论 0原文

这是我的类结构:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生一梦 2024-09-09 04:20:45

我找到了一个解决方案,所以我想我会将其发布在这里,以防其他人遇到这个问题。

事实证明,C 类上的额外注释导致了该问题。当我摆脱除实体之外的所有内容并将所有其他类保留原样(具有适当的鉴别器值)时,一切正常。

@Entity
public class C extends A
...

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.

@Entity
public class C extends A
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文