有没有办法在INSERT / DELETE期间禁用它?
情况:
我有一个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操作,而只是通过同步过程执行。
最佳答案
您无法在休眠状态下禁用约束检查,因为休眠状态会显示最初由数据库抛出的错误。
您可能使用相同的数据库连接来插入数据。但是正如您所说的,您有多个数据库,您需要为另一个数据库获得连接/会话。如果表定义正确,则可以插入而无需参考其他书籍。
另外,您还需要删除联接,因为这些联接仅用于同一列中的表。如果这些表不共享相同的数据库(因此不共享会话),则需要手动连接“书籍和封面”。