Задать вопрос
@Crunkor

Как заставить Hibernate автоматически связывать объекты?

Добрый день

Есть таблицы:
Таблица Author
@Entity
@Getter
@Setter
public class Author implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
....

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY, mappedBy = "author")
    private Book book;
}

Таблица Book
@Entity
@Getter
@Setter
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
...

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private Author author;
}


Все сущностью создаются с помощью JAXB из XMl-файла. Всё хорошо, вот только у объекта book поле author - null.

Код записи в БД:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.persist(author);
session.getTransaction().commit();
session.close();


В таком случае в таблицы book и author записываются строки, только book.author_id = null.

При выполнении кода
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
author.getBook().setAuthor(author);
session.persist(author);
session.getTransaction().commit();
session.close();

Все данные записываются так, как мне надо.

Проблема в том, что таких таблиц и связей очень много и прописывать команды типа author.getBook().setAuthor(author) не правильно на мой взгляд. Да и сама команда как-то странно выглядит.

Как заставить hibernate автоматически подставлять в дочерние элементы ссылку на родителя?

p.s. Вместо @MapsId писал @JoinColumn, но на результат это не повлияло.
  • Вопрос задан
  • 259 просмотров
Подписаться 2 Сложный Комментировать
Решения вопроса 1
@Crunkor Автор вопроса
Проблема решена.
Всё оказалось достаточно просто.
Т.к. объект создавался с помощью JAXB, то во время формирования нужно было указать ему ссылку на объект родителя
void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        author = (Author ) parent;
    }


После это всё начало работать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@SeApps
Я художник, я так вижу
Или я тупой, или CascadeType.ALL
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы