Hibernate约束冲突/回滚错误

Hibernate约束冲突/回滚错误,hibernate,constraints,rollback,Hibernate,Constraints,Rollback,我在hibernate中遇到了一个奇怪的错误,很可能是由于不正确地使用了它,但是我想知道是否有任何方法可以找到它的根本原因,也许可以补救它 目前,我的类层次结构如下所示: @Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "tbl_class_a) public ClassA { ... private int propA; ... } @Entity @Table(name

我在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;
    ...
}

我已经广泛地测试了所有三个类的对象的持久性和删除,并且在考虑属性的约束,特别是关于持久性的情况下,一切似乎都正常进行。p> 现在,我实例化了一个类C的对象newObj,它的propB值等于一个all ready持久化对象,而all ready的propB值就是all ready。我尝试将其持久化,正如预期的那样,将抛出一个约束冲突,并尝试回滚事务。我希望所有newObj的痕迹都会被清除,但是发生了一些非常奇怪的事情。C类和B类的表中对newObj的所有引用确实都被删除了,但A类的表中的属性仍然存在,而且据我所知是不可恢复的。为什么???

MySQL的MyISAM引擎

Hibernate按从父级到子级的顺序在“联接”层次结构中插入行。因此:

  • 插入表A中的行
  • Hibernate尝试将行插入表B,但失败(未插入行)
  • 并没有尝试将行插入表C(因为会话刷新失败并引发异常)

  • 没有事务意味着没有回滚,所以您最终得到的是表A中的行。

    您是否每次都使用MySQL/MyISAM?我使用的是MySQL 5.0.75。我不认为这是数据库的问题,而是映射器的问题。