2014-10-28 69 views
1

有沒有辦法在INSERT/DELETE期間禁用這個?休眠 - 禁用MySQLIntegrityConstraintViolationException

情況: 我有一個masterDB和一個library1DB和library2DB。

library1DB和library2DB是兩個獨立的數據庫,但具有相同的模式,因爲每個庫都必須有自己的數據庫。現在我們有一個masterDB,它是所有庫(library1DB和library2DB)中所有數據的聚合版本,仍然記下它們各自的ID並將它們映射到它們的庫ID。

這是我在masterDB中的書模型的結構?

Book.java

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long masterId; 

@Column 
private long id; 

@Column 
private String title; 

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "book") 
private List<BookCoverHistory> bookCoverHistory; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "LIBRARY_ID") 
private Library library; 

這是所有好,很好。

但是在我的BookCoverHistory插入數據時,我得到下面的異常。

BookCoverHistory.java

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long masterId; 

    @Column 
    private long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "BOOK_ID") 
    private Book book; 

    @Column 
    private String desc; 

這裏的例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`master_db`.`book_cover_history`, CONSTRAINT `FK_10ggatm9ptqayo4naj23329rc` FOREIGN KEY (`book_id`) REFERENCES `book` (`master_id`)) 

所以我想,我只是禁用的約束,因爲我不是很具體的給他們,因爲我剛剛聚集我的庫中的數據到masterDB,並且不會手動執行CRUD操作,而只是通過同步過程。

回答

0

您不能在hibernate中禁用約束檢查,因爲hibernate會顯示最初由數據庫拋出的errror。

您可能使用相同的數據庫連接來插入數據。但正如你所說你有多個數據庫,你需要爲你的其他數據庫獲得連接/會話。如果表格定義良好,則可以插入而不參考其他書籍。

另外,您需要刪除連接,因爲這些連接僅適用於同一列中的表。如果這些表不共享相同的數據庫(以及會話),則需要手動加入書籍和封面。