【发布时间】:2015-10-22 16:37:09
【问题描述】:
在我的数据库中,我有两个表 Book 和 Label,它们之间具有 ManyToMany 关系。我已经使用 CascadeALL 的 ManyToMany 注释在 Hibernate 中成功映射了它们。
现在考虑这种情况。
当我添加带有标签列表的新书时。标签列表包含现有标签和新标签。当这本书保存在数据库中时,它会创建现有标签的重复条目。 [意味着每次创建新标签时(即使是现有标签),主键不同,而不是使用现有和更新多对多表的引用]。我希望 Hibernate 更新现有标签并创建新的。类似地,ManyToMany 表要自行更新。
我可以考虑手动解决。
- 保存没有标签的书。
- 将现有标签和新标签与图书标签与图书标签分开。
- 使用
session.update()更新现有标签并使用session.save()保存新标签 - ManyToMany 表将自动更新。
但我相信这个解决方案涉及很少的冗长编码和不必要的处理,并且可以改进。
Hibernate 是否提供了一些内置功能来解决这个问题以及如何改进我的解决方案。
这是我的图书实体
@Entity
@XmlRootElement
public class Book {
@Id
@GeneratedValue
private int bookID;
private String bookName;
private String bookDescription;
private String bookAuthor;
private String bookEdition;
private String bookDownloadURL;
private String bookImageURL;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(name = "book_label", joinColumns = { @JoinColumn(name = "books_bookID") }, inverseJoinColumns = {
@JoinColumn(name = "labels_labelID") })
private List<Label> labels = new ArrayList<Label>();
//getters and setters
标签实体
@Entity
@XmlRootElement
public class Label {
@Id
@GeneratedValue
private int labelID;
private String labelName;
private String labelDesc;
@ManyToMany(mappedBy="labels",fetch=FetchType.EAGER)
private List<Book> books = new ArrayList<Book>();
// getter and setters
在我的数据库中,我已经创建了三个表
- col 名称与 Book 实体的数据成员完全相同的 book 表
- col 名称与 Label 实体的数据成员完全相同的标签表
- book_label 表有两列 books_bookID、labels_labelID。这些列分别引用其他两个表中的 bookID 和 labelID(意味着它们实际上是外键)
这是我的测试用例代码
BookDAO booksDao = new BookDAO();
LabelDAO labelDao = new LabelDAO();
//Label by these name exist already in database.
//Upon adding the new book it should use the previous label and do entries in manytomany table accordingly
// (shouldn't create new labels with same names and map against them) <- THis is happening now
Label label1= new Label();
label1.setLabelName("Fantasy");
Label label2= new Label();
label2.setLabelName("Literature");
Book book1= new Book();
book1.setBookName("Talaash");
book1.getLabels().add(label1);
book1.getLabels().add(label2);
booksDao.addBook(book1);
【问题讨论】:
-
你能告诉我们这些类以便我们看到注释吗?
标签: java hibernate jpa orm many-to-many