В моей базе данных у меня есть две таблицы на сайте и Этикетка с 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
В моей базе данных у меня есть три таблицы созданы уже
- книга таблица с именем Col точно такой же, как datamembers юридического лица
- таблица с таблицей с именем col точно такая же, как и данные данных объекта метки
- 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);
Можете ли вы показать нам классы, чтобы мы могли видеть анотацию? – giannisapi