2015-07-31 7 views
0

В моей базе данных у меня есть две таблицы на сайте и Этикетка с ManyToMany отношения между ними. Я успешно их сопоставил в Hibernate, используя аннотацию ManyToMany с CascadeALL.Обновление существующих записей в Hibernate ManyToMany Relation

Теперь рассмотрим этот сценарий.

Когда я добавляю новую Книгу с списком ярлыков. Список ярлыков содержит существующие и новые ярлыки. Когда книга сохраняется в базе данных, она создает повторяющиеся записи существующих меток. [Значит каждый раз, когда будет создан новый ярлык (даже для существующих меток) с другим первичным ключом, вместо использования ссылки на существующую и обновленную таблицу ManyToMany]. Я хочу, чтобы Hibernate обновлял существующие метки и создавал новые. Аналогично, таблица ManyToMany обновляется сама.

Я могу придумать решение для этого вручную.

  • Сохраните книгу без ярлыков.
  • Отделив существующие и новые ярлыки от справочника книг, от лейблов книг.
  • Обновление существующих меток с использованием session.update() и сохранить новый, используя session.save()
  • Таблица ManyToMany будет автоматически обновляться.

Но я считаю, что это решение требует мало длительной кодировки и ненужной обработки и может быть улучшено.

Есть ли Hibernate предоставляет встроенную функцию для решения этой проблемы и как мое решение может быть улучшено.

Здесь идет Накопитель My Book Entity

@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

@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. книга таблица с именем Col точно такой же, как datamembers юридического лица
  2. таблица с таблицей с именем col точно такая же, как и данные данных объекта метки
  3. 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); 
+0

Можете ли вы показать нам классы, чтобы мы могли видеть анотацию? – giannisapi

ответ

3

Если я правильно понимаю, ваша проблема в том, что оба таблицы являются владельцами отношений, поэтому это приводит к дублированию записей. Только один класс должен быть владельцем отношений.В одном из ваших занятий попробуйте что-нибудь вроде:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "books") 
public List<Label> getLabels() 

и на вашем лейбле у вас должен быть список книг. Опять же, если я правильно понимаю, потому что вы не предоставляете классы, чтобы у нас был лучший анализ.

+0

Уважаемый номер. Уже есть только один владелец. В двух экземплярах я имею в виду, если в моей книге есть метки, которые уже созданы. Он создает для них новые строки ярлыков. Если я добавлю книгу с лейблом литературы. Он всегда будет создавать новую строку в таблице меток и сопоставлять ее. Скорее, он должен использовать предыдущие ссылки на ярлыки и обновлять только таблицу сопоставления. Надеюсь, вы поймете мою мысль. Если не сообщите мне, я объясню, цитируя примерный сценарий подробно. –

+0

У меня теперь есть фрагменты кода для атташе. –

+0

по ссылке previours вы имеете в виду, что это должно найти ярлык с именем Literature и использовать this.am я правильно? Если да. то это нормальное поведение, а не ошибка, потому что ваше имя метки не является уникальным идентификатором. вы должны восстановить этот ярлык и установить book.getLabels.add (метка с соответствующим идентификатором). ты понимаешь меня? – giannisapi

 Смежные вопросы

  • Нет связанных вопросов^_^