0

我遇到了一个奇怪的休眠错误,很可能是由于使用不当造成的,但我想知道是否有任何方法可以找到它的根本原因并进行补救。

目前我有一个类层次结构,如下所示:



@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "tbl_class_a)
public ClassA {
    ...
    private int propA;
    ...
}

@Entity 
@Table(name = "tbl_class_b")
public ClassB extends ClassA {
    ...
    @Column(unique = true)
    private int propB;
    ...
}

@Entity
@Table(name = "tbl_class_c")
public ClassC extends ClassC {
    ...
    private int propC;
    ...
}

我已经广泛测试了所有三个类的对象的持久性和删除,并且一切似乎都正常执行,直到我考虑对属性的约束,特别是。关于坚持。

现在我实例化一个 C 类的对象 newObj,它的 propB 值等于所有就绪的持久对象,所有就绪对象的 propB 都具有该值。我尝试将其持久化,并且正如预期的那样,引发了违反约束并且我尝试回滚事务。我希望 newObj 的所有痕迹都会被删除,但是会发生一些非常奇怪的事情。确实删除了 C 类和 B 类表中对 newObj 的所有引用,但 A 类表中的属性仍然存在,并且据我所知无法恢复。为什么??

4

1 回答 1

1

MySQL 的 MyISAM 引擎不支持事务

Hibernate 按顺序在“连接”层次结构中插入行 - 从父级到子级。所以:

  1. 表 A 中的行被插入
  2. Hibernate 尝试将行插入表 B 并失败(未插入行)
  3. 没有尝试将行插入到表 C 中(因为会话刷新失败并且抛出了异常)

没有事务意味着没有回滚,因此您最终会得到表 A 中的行。

于 2009-10-22T22:02:51.080 回答