2014-10-28 78 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。

您可能使用相同的数据库连接来插入数据。但正如你所说你有多个数据库,你需要为你的其他数据库获得连接/会话。如果表格定义良好,则可以插入而不参考其他书籍。

另外,您需要删除连接,因为这些连接仅适用于同一列中的表。如果这些表不共享相同的数据库(以及会话),则需要手动加入书籍和封面。