2009-10-22 130 views
0

我遇到了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; 
    ... 
} 
 

我已經廣泛使用所有這三個類的對象的持久性和刪除,一切似乎直到我考慮對性能的限制來正常進行, ESP。關於持久性。

現在我實例化一個類C的對象newObj,該對象的propB值等於所有準備好的持久對象都已準備好了它的propB值。我試圖堅持下去,並且正如所料,違反了約束條件,我試圖回滾事務。我期望newObj的所有痕跡都會被刪除,但是會發生一些非常奇怪的事情。在C和B類的表中,對newObj的所有引用都被刪除,但A類表中的屬性仍然存在,並且據我所知,不可挽回。爲什麼??

+0

你每使用MySQL的機會/ MyISAM的結束? – ChssPly76 2009-10-22 21:14:49

+0

我正在使用MysQl 5.0.75。我並沒有覺得這是數據庫的問題,而是映射器。 – user194877 2009-10-22 21:50:58

回答

1

MyISAM引擎,用於MySQL does not support transactions

Hibernate按順序在「連接」層次結構中插入行 - 從父到子。所以:

  1. 一行到表格中的被插入
  2. Hibernate試圖插入行的表B和失敗(行未插入)
  3. 沒有嘗試插入行表C(因爲會話刷新失敗和異常被拋出)

無交易意味着沒有回退,所以你與行表A