我遇到了一个与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类表中的属性仍然存在,并且据我所知,这是不可挽回的。为什么?
答案 0 :(得分:1)
MySQL does not support transactions的MyISAM引擎。
Hibernate按顺序在“已连接”层次结构中插入行 - 从父级到子级。所以:
没有事务意味着没有回滚,所以你最终得到表A中的行。