Hibernate约束违规/错误回滚

时间:2009-10-22 20:43:02

标签: hibernate constraints rollback

我遇到了一个与hibernate有关的奇怪错误,很可能是因为它使用不当,但我想知道是否有办法找到它的根本原因并可能解决它。

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



@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类表中的属性仍然存在,并且据我所知,这是不可挽回的。为什么?

1 个答案:

答案 0 :(得分:1)

MySQL does not support transactions的MyISAM引擎。

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

  1. 行插入表A
  2. Hibernate尝试将行插入表B并失败(未插入行)
  3. 没有尝试将行插入表C(因为会话刷新失败并抛出异常)
  4. 没有事务意味着没有回滚,所以你最终得到表A中的行。