首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新Hibernate ManyToMany关系中的现有记录

更新Hibernate ManyToMany关系中的现有记录
EN

Stack Overflow用户
提问于 2015-07-31 05:30:44
回答 1查看 8.4K关注 0票数 2

在我的数据库中,我有两个表:BookLabel,它们之间有ManyToMany关系。我使用ManyToManyCascadeALL的注释在Hibernate中成功地映射了它们。

现在考虑一下这个场景。

当我添加一本带有标签的新书时。标签列表同时包含现有标签和新标签。当书保存在数据库中时,它会创建现有标签的重复条目。这意味着每次使用不同的主键创建一个新标签(即使是现有标签),而不是使用现有和更新的ManyToMany表.I的引用来更新现有标签和创建新标签。类似地,要更新的ManyToMany表本身。

我可以想出解决办法,手动完成它。

  • 保存没有标签的书。
  • 将现有的和新的标签从图书标签中分离出来。
  • 使用session.update()更新现有标签,并使用session.save()保存新标签
  • ManyToMany表将自动更新。

但是我相信这是一个解决方案,只需要很少长的编码和不必要的处理,并且可以改进。

是否有Hibernate提供了一些内置功能来解决这个问题,以及如何改进我的解决方案。

这是我的书实体

代码语言:javascript
运行
复制
@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

标签实体

代码语言:javascript
运行
复制
@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

在我的数据库中,已经创建了三个表

  1. 同名的图书表与图书实体的数据采集器完全相同
  2. 标号表与标签实体的数据表完全相同。
  3. book_label表,包含两列books_bookID,labels_labelID。这些列分别引用其他两个表中的bookID和labelID (表示它们实际上是外键)。

这是我的测试用例代码

代码语言:javascript
运行
复制
    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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-31 07:30:04

如果我正确理解,您的问题是两个表都是关系的所有者,因此这会导致重复条目。只有一个类应该是关系的所有者。在其中一个yout类中,尝试这样的方法:

代码语言:javascript
运行
复制
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "books")
public List<Label> getLabels()

在你的标签里你应该有书单。同样,如果我理解正确,因为您没有提供类,所以我们有一个更好的分析。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31738710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档