powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate автоматически связывать объекты?
78 сообщений из 78, показаны все 4 страниц
Как заставить Hibernate автоматически связывать объекты?
    #39899803
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Есть таблицы:
Таблица Author
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@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
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@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.

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




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

При выполнении кода
Код: java
1.
2.
3.
4.
5.
6.
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, но на результат это не повлияло.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899811
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Проблема в том, что таких таблиц и связей очень много и прописывать команды типа author.getBook().setAuthor(author) не правильно на мой взгляд. Да и сама команда как-то странно выглядит.

Дай ссыль или букварь или спеку как надо и мы посмотрим. Правильно или нет.
Не по памяти же код писал?

Crunkor
Все сущностью создаются с помощью JAXB из XMl-файла.
а это причем?
Сломалось после JAXB?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899814
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Код: java
1.
author.getBook().setAuthor(author);

как ты иначе связь двух сущностей вставишь?
Короче, hello world где?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899829
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
]
как ты иначе связь двух сущностей вставишь?


Это я и хотел спросить =).

Для чего нужны все эти связи, если нужно вручную прописывать каждую из них? В моем коде условный объект Author имеет огромное множество таких связей, неужели их надо прописывать вручную?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899831
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp

как ты иначе связь двух сущностей вставишь?


Это я и хотел спросить =).

Для чего нужны все эти связи, если нужно вручную прописывать каждую из них? В моем коде условный объект Author имеет огромное множество таких связей, неужели их надо прописывать вручную?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899837
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Это я и хотел спросить =).
а зачем JAXB приплел?

Crunkor
Для чего нужны все эти связи, если нужно вручную прописывать каждую из них?

Пример из справки один ко многим где?
Там руками ставится?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899838
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
В моем коде условный объект Author имеет огромное множество таких связей,
мы не видим.
Ты не показал.
И по какой нормальной форме нормализовал модель тоже не видим.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899844
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у вас приходит XML извне, то выкиньте хибер и сохраняйте эти xml прямо в блоб.
Либо отработайте хибер, но не приплетайте jaxb. Они на разных планетах друг от друга.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899856
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
@JoinColumn(name="внешний id", referencedColumnName="id справочника")


Попробуй так.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899859
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Если у вас приходит XML извне, то выкиньте хибер и сохраняйте эти xml прямо в блоб.
Либо отработайте хибер, но не приплетайте jaxb. Они на разных планетах друг от друга.


В XML приходит база данных.
Что-то типа:
Код: xml
1.
2.
3.
4.
5.
6.
<AUTHOR>
    <NAME>Автор 1</NAME>
    <BOOK>
        <NAME>Книга 1</NAME>
    </BOOK>
</AUTHOR>


На самом деле XML достаточно большой и разветвленный.

При помощи JABX я создаю из этого XML файла объект
Код: java
1.
2.
3.
JAXBContext context = JAXBContext.newInstance(Author.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Author author = (Author) unmarshaller.unmarshal(new File(fileHeader.getFileName()));


JABX на мой взгляд выполняет все успешно. Создается объект author в котором присутствуют все поля и вложенные объекты.

Классы с JAXB+HIBERNATE
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
@XmlRootElement(name="AUTHOR")
@XmlAccessorType(XmlAccessType.FIELD)
public class Author implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
  
    @XmlElement(name="NAME")
    private String Name;

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


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
@XmlRootElement(name="BOOK")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @XmlElement(name="NAME")
    private String Name;

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




После этого я хочу author записать в базу данных.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899867
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
Код: java
1.
@JoinColumn(name="внешний id", referencedColumnName="id справочника")


Попробуй так.


Не помогло. Поле book у объекта author всё так же null.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899880
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
На самом деле XML достаточно большой и разветвленный.
допустим 200 таблиц.
А с циклическими связями как?
Crunkor
При помощи JABX я создаю из этого XML файла объект
попробуй реальную базу записной книжки из 5 таблиц. Не выйдет.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899883
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
После этого я хочу author записать в базу данных.
зачем ВСЮ БД перегонять туда сюда через xml?
Странная задача.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899893
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
На самом деле XML достаточно большой и разветвленный.
допустим 200 таблиц.
А с циклическими связями как?
Crunkor
При помощи JABX я создаю из этого XML файла объект
попробуй реальную базу записной книжки из 5 таблиц. Не выйдет.


JAXB прекрасно создает объект, с ним проблем нет.

PetroNotC Sharp
Crunkor
После этого я хочу author записать в базу данных.
зачем ВСЮ БД перегонять туда сюда через xml?
Странная задача.


Перегоняется не вся база а только часть. Xml файлов много, каждый содержит свои данные, а структура одна.

Команда
Код: java
1.
session.persist(author);


присваивает объектам ID, но оставляет пустым поле author у book. Мне кажется, что тут не хватает либо какой-то настройки, либо неправильно указаны связи между таблицами.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899900
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
JAXB прекрасно создает объект, с ним проблем нет.
а мы же про связи?)))))
Он заточен передавать коллекции без связей. VO или DTO.
Получил коллекцию, принял коллекцию.
Коллекцию в базу.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899904
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Мне кажется, что тут не хватает либо какой-то настройки, либо неправильно указаны связи между таблицами.
документация когда будет?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899906
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Не помогло. Поле book у объекта author всё так же null.
hello world из сети когда будет?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899953
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
JAXB прекрасно создает объект, с ним проблем нет.
а мы же про связи?)))))
Он заточен передавать коллекции без связей. VO или DTO.
Получил коллекцию, принял коллекцию.
Коллекцию в базу.


Не совсем понял, что вы хотели сказать.

PetroNotC Sharp
Crunkor
Мне кажется, что тут не хватает либо какой-то настройки, либо неправильно указаны связи между таблицами.
документация когда будет?


xD Это намек на то, что бы я пошел читать какую-нибудь книгу по Hibernate с 600+ страницами ? Видимо пока другого выхода нет.

PetroNotC Sharp
Crunkor
Не помогло. Поле book у объекта author всё так же null.
hello world из сети когда будет?


Слишком тонко для меня.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899963
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Не совсем понял, что вы хотели сказать.
я не видел НИГДЕ твоей задачи. Она странная. Прэтому прошу подробностей.
Понятно?
Crunkor
книгу по Hibernate с 600+ страницами ?

Hello world один ко многим.
....
сущностьА.добавитьСвязь(б)
Везде это надо.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899966
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor,
Вон, у apb12 спроси. Может в спринге какое таинство есть и связи сами сохраняются.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39899988
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
Не совсем понял, что вы хотели сказать.
я не видел НИГДЕ твоей задачи. Она странная. Прэтому прошу подробностей.
Понятно?
Crunkor
книгу по Hibernate с 600+ страницами ?

Hello world один ко многим.
....
сущностьА.добавитьСвязь(б)
Везде это надо.


Всё равно не понятно о какой другой задаче идет речь кроме как записать объект author в БД с использованием Hibernate.

сущностьА.добавитьСвязь(б)
Разве не для этого прописываются аннотации? В моем случае @OneToOne
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900018
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor

Разве не для этого прописываются аннотации? В моем случае @OneToOne

Мне интересно, ты представлял себя на месте хибера? Как ты поймешь что объект автор и объект бук надо связать?
После создания JAXB объектом - ссылки правильно расставлены?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900023
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Разве не для этого прописываются аннотации? В моем случае @OneToOne

Да. Но без JAXB ЖЕ?
Пример то поищи в инете.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900024
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник
Crunkor

Разве не для этого прописываются аннотации? В моем случае @OneToOne

Мне интересно, ты представлял себя на месте хибера? Как ты поймешь что объект автор и объект бук надо связать?
После создания JAXB объектом - ссылки правильно расставлены?

Вручную я ссылки нигде не расставлял. Мне казалось, что этим должен был заняться hibernate после указаний аннотаций.
Конструкции типа author.getBook().setAuthor(author) на мой взгляд неправильные. Для чего в книге, которая сидит в авторе указывать ее автора?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900030
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Конструкции типа author.getBook().setAuthor(author) на мой взгляд неправильные. Для чего в книге, которая сидит в авторе указывать ее автора?
а где ты взял этот код?))))
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900032
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
Конструкции типа author.getBook().setAuthor(author) на мой взгляд неправильные. Для чего в книге, которая сидит в авторе указывать ее автора?
а где ты взял этот код?))))

Сам написал))) После этого данные записываются нормально)
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900033
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor

Вручную я ссылки нигде не расставлял. Мне казалось, что этим должен был заняться hibernate после указаний аннотаций.
Конструкции типа author.getBook().setAuthor(author) на мой взгляд неправильные. Для чего в книге, которая сидит в авторе указывать ее автора?

Хибернейт всего лишь отображает объектные ссылки(в памяти твоей программы) на реляционные таблицы(связи по foreign key). Если объекты в памяти никак не связаны - то как хибернейт может догадаться сделать это? Либо book должен содержать authorId, либо Author должен иметь коллекцию books(в памяти). Тогда хибер все сделает сам(при правильном маппинге). Если ссылки нулевые - то на что тогда надеяться?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900035
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Сам написал)))
поздравляю. Ты пишешь проги методом тыка. Продолжай)
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900041
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
Сам написал)))
поздравляю. Ты пишешь проги методом тыка. Продолжай)

Зашел в тупик)
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900045
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Зашел в тупик)
Hello world гугле.
И не бреши про 600 страниц. Ленивых тут не любят.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900047
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник
Crunkor

Вручную я ссылки нигде не расставлял. Мне казалось, что этим должен был заняться hibernate после указаний аннотаций.
Конструкции типа author.getBook().setAuthor(author) на мой взгляд неправильные. Для чего в книге, которая сидит в авторе указывать ее автора?

Хибернейт всего лишь отображает объектные ссылки(в памяти твоей программы) на реляционные таблицы(связи по foreign key). Если объекты в памяти никак не связаны - то как хибернейт может догадаться сделать это? Либо book должен содержать authorId, либо Author должен иметь коллекцию books(в памяти). Тогда хибер все сделает сам(при правильном маппинге). Если ссылки нулевые - то на что тогда надеяться?


У таблицы book есть поле author_id которое является внешним ключом к полю id таблицы author. У меня проблема с маппингом?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900076
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor

У таблицы book есть поле author_id которое является внешним ключом к полю id таблицы author. У меня проблема с маппингом?

Ты так и не ответил на вопрос - после создания объекта через JAXB - ссылки в памяти расставлены правильно? Останови в дебаггере и посмотри. Если расставлены - то да, проблема в маппинге. На самом деле он не самый интуитивный, я постоянно смотрел по предыдущим проектам как это правильно делается.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900180
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник
Crunkor

У таблицы book есть поле author_id которое является внешним ключом к полю id таблицы author. У меня проблема с маппингом?

Ты так и не ответил на вопрос - после создания объекта через JAXB - ссылки в памяти расставлены правильно? Останови в дебаггере и посмотри. Если расставлены - то да, проблема в маппинге. На самом деле он не самый интуитивный, я постоянно смотрел по предыдущим проектам как это правильно делается.


В объекте созданным с помощью JAXB есть все ссылки.

Мне непонятен один процесс... JAXB создает объект author с полем типа String и полем типа Book. В поле типа Book записана ссылка на тот самый объект book который должен там быть по XML структуре.
Помимо этого у объектов author и book есть поля id, а у объекта book есть дополнительное поле типа Author, в котором должна храниться ссылка на родительский объект.
После того как JAXB создает объект, все эти три поля равны null, что логично, т.к. он о них не знает.
После того, как выполняется команда session.persist(author) поля id у author и book заполняются данными, полученными через обращение к БД (к таблицам sequence).
В какой момент поле типа Author объекта book должно присваивать значение? При правильном маппинге автоматически при вызове команды session.persist(author)?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900201
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor

В какой момент поле типа Author объекта book должно присваивать значение? При правильном маппинге автоматически при вызове команды session.persist(author)?

Покажи уже маппинг. Вообще иметь и айди и ссылку - избыточно, обычно либо то либо другое. При persist поле author конечно же выставляться не должно. Но вот при следующем read оно там уже будет. Короче у тебя стопудово корявый маппинг
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900204
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
После того, как выполняется команда session.persist(author)
а кто вам сказал что это надо делать?
Есть jpa. Есть хибер API.
Во втором не надо делать. А в первом?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900208
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хибер в один ко многим не запрашивает бд при связи ссылкой.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900212
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник
Crunkor

В какой момент поле типа Author объекта book должно присваивать значение? При правильном маппинге автоматически при вызове команды session.persist(author)?

Покажи уже маппинг. Вообще иметь и айди и ссылку - избыточно, обычно либо то либо другое. При persist поле author конечно же выставляться не должно. Но вот при следующем read оно там уже будет. Короче у тебя стопудово корявый маппинг


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
@XmlRootElement(name="AUTHOR")
@XmlAccessorType(XmlAccessType.FIELD)
public class Author implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
  
    @XmlElement(name="NAME")
    private String Name;

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


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
@XmlRootElement(name="BOOK")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @XmlElement(name="NAME")
    private String Name;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private Author author;
}
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900214
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor,
Молодец.
Теперь минималный код вставки автора и книги.
Вывод сюда.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900235
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor,
Молодец.
Теперь минималный код вставки автора и книги.
Вывод сюда.


Создание объектов
Код: java
1.
2.
3.
JAXBContext context = JAXBContext.newInstance(Author.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Author author = (Author) unmarshaller.unmarshal(new File(fileHeader.getFileName()));



Запись в БД
Код: java
1.
2.
3.
4.
5.
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.persist(author);
session.getTransaction().commit();
session.close();



Ошибка - javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property
В дебаге Book.author - null
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900243
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor,
Вставка без jaxb. Из хелпа по хиберу
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900271
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще one-to-one достаточно мутный аспект хибернейта. Более того, я не понимаю зачем он вообще нужен и почему не держать все в одной сущности? Тебе точно нужна bidirectional связь? В общем я бы отрефакторил это все сначала именно с точки зрениЯ предметной области а уже потом переходил к сохранению. Если такого желания нет - ну смотри сам, надо разбираться и пробовать. Я уже лет 6 слава богу с хибернейтами не воевал, с ходу не скажу, вроде выглядит правильно маппинг. Напиши тест, где изолируй один бук, одного автора и пробуй до посинения пока сохранение не пройдет
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900282
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor,
Вставка без jaxb. Из хелпа по хиберу


Код: java
1.
2.
3.
4.
5.
Author author = new Author();
author.setName("Author 1");
author.setBook(new Book("Book 1"));

session.persist(author);


Так ?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900297
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
Вообще one-to-one достаточно мутный аспект хибернейта
да.
Наконец то упрямого автора заставили показать что у него в реале.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900298
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Так ?
один к одному выбрось.
Ты не видел что я 5 раз про один ко многим писал?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900386
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
Так ?
один к одному выбрось.
Ты не видел что я 5 раз про один ко многим писал?


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Person person = new Person();
Phone phone1 = new Phone( "123-456-7890" );
Phone phone2 = new Phone( "321-654-0987" );

person.addPhone( phone1 );
person.addPhone( phone2 );
entityManager.persist( person );
entityManager.flush();


?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900395
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor,
Угу. Теперь маппинг из книжки возьми.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900400
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor,
Угу. Теперь маппинг из книжки возьми.


В их маппинге вся суть в методе
Код: java
1.
2.
3.
4.
	public void addPhone(Phone phone) {
		phones.add( phone );
		phone.setPerson( this );
	}



JAXB, судя по получаемому результату, выполняет команду phones.add( phone );, но не выполняет phone.setPerson( this ); (По всей видимости он и не должен)
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900412
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
В их маппинге вся суть в методе
а ты думал там волшебство?
Crunkor
По всей видимости он и не должен)

Ну ты наверно, ткнул пальцем в небо и решил писать.
У связей еще есть направление. Каскад, вычисляемые,...
Каким боком jaxb будет понимать аннотации хибера.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900434
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Crunkor
В их маппинге вся суть в методе
а ты думал там волшебство?
Crunkor
По всей видимости он и не должен)

Ну ты наверно, ткнул пальцем в небо и решил писать.
У связей еще есть направление. Каскад, вычисляемые,...
Каким боком jaxb будет понимать аннотации хибера.


Как быть в такой ситуации?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900445
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor,
василий если ты хочешь чтобы хибер нормально работал ты должен сделать так
https://github.com/apb12/FlowerShop.v.2.0/blob/master/src/main/java/com/accenture/microservice/entity/Bucket.java

OneToOne определяется в одной сущности и там нет никаких фетчей
пиши это в авторе а в книге ты должен это убрать
а вообще это ошибка архитектуры
у одного автора может быть много книг
и отношение тут не one2one а one2many
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900451
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

я ему уже написал - сущности кривые
если 1 к 1 то нужно делать как у меня в примере
я тоже в свое время такую же ошибку словил
ему просто нужно понять что если он публикует отношения они должны быть в одной из таблиц а не в двух
но для этого нужно хотя бы месячные курсы по бдшкам пройти
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900477
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Проблема в том, что таких таблиц и связей очень много и прописывать команды типа author.getBook().setAuthor(author) не правильно на мой взгляд. Да и сама команда как-то странно выглядит.

Crunkor
Как быть в такой ситуации?

Мы выяснили что с хибером все нормально.
Нужно озвучить задачу. Описать модель. Убрать один к одному.
Так как ты написал что связей 50 штук. Это значит вместо сущности одной с 50 полями, ты сделал 50 сущностей с FK.
А так не делают.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900484
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
apb12
Crunkor,
а вообще это ошибка архитектуры
у одного автора может быть много книг
и отношение тут не one2one а one2many


Это был просто пример.

apb12
PetroNotC Sharp,
ему просто нужно понять что если он публикует отношения они должны быть в одной из таблиц а не в двух


"В какой документации такое написано?" (с) PetroNotC Sharp


PetroNotC Sharp

Убрать один к одному.

Почему один к одному так плох? Если у объекта может быть только один наследник, то всё равно лучше делать OneToMany ?

PetroNotC Sharp

Так как ты написал что связей 50 штук. Это значит вместо сущности одной с 50 полями, ты сделал 50 сущностей с FK.
А так не делают.


На самом деле сущность одна. Один объект, который имеет связи как OneToOne, так и OneToMany, а эти связи имеют еще свои связи и т.д. Я просто упростил для большей ясности.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900487
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor


"В какой документации такое написано?" (с) PetroNotC Sharp


и.

я не силен в sql ,но что то мне подсказывает что в отношении двух таблиц не может быть двух foreign key которые указывают друг на друга
вы товарисчь вместо споров просто опробуйте предложенное
в авторе оставьте что есть ,в книге уберите
и у вас все заработает
я вам выше привет ссылку на гит хаб с рабочим проектом -и там все прекрасно работает
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900489
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor


На самом деле сущность одна. Один объект, который имеет связи как OneToOne, так и OneToMany, а эти связи имеют еще свои связи и т.д. Я просто упростил для большей ясности.

смотри сюда алексей
есди связь 1т1 то ты должен указать это только в одной сущности
если 1тМ
то в двух
иначе хибер тебя просто не поймет
я тебе дал ссылку на рабочий проект открой там фолдер Entity и все станет понятно,так как там есть все виды отношений
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900491
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
apb12

я не силен в sql ,но что то мне подсказывает что в отношении двух таблиц не может быть двух foreign key которые указывают друг на друга


FK у меня только один. В таблице book поле author_id.

apb12

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


Оставил в авторе и убрал в книге.

Выходит ошибка "ОШИБКА: столбец "book_id" в таблице "author" не существует"
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900504
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох жесть.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
...

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



Вот какое поведение ожидается, когда мы говорим что ID нужно и генерить и шарить с автором одновременно? Там еще в хибере есть такое:

hibernate.enhancer.enableAssociationManagementhibernate.enhancer.enableAssociationManagement (e.g. true or false (default value))
Enable association management feature in runtime bytecode enhancement which automatically synchronizes a bidirectional association when only one side is changed.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900506
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor


Выходит ошибка "ОШИБКА: столбец "book_id" в таблице "author" не существует"

ты посмотрел код на гитхабе что я тебе дал?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900508
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
apb12
Crunkor


Выходит ошибка "ОШИБКА: столбец "book_id" в таблице "author" не существует"

ты посмотрел код на гитхабе что я тебе дал?

Да, посмотрел. У тебя там "магия" спринга что-то делает. (В BucketRepo.java - JpaRepository)
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900517
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
apb12
пропущено...

ты посмотрел код на гитхабе что я тебе дал?

Да, посмотрел. У тебя там "магия" спринга что-то делает. (В BucketRepo.java - JpaRepository)

JPaRepository никакого к этому отношения не имеет,это хибернейтовский интерфейс который генерирует тебе запросы в базу
вместо дрочбы с написаниаем SQL запросов и их обработкой
смотри на сущность в папке Entity
там есть Bucket и Flower.. у которых как раз отношение 1 к 1
и все прекрасно работает
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900526
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
apb12
Crunkor
пропущено...

Да, посмотрел. У тебя там "магия" спринга что-то делает. (В BucketRepo.java - JpaRepository)

JPaRepository никакого к этому отношения не имеет,это хибернейтовский интерфейс который генерирует тебе запросы в базу
вместо дрочбы с написаниаем SQL запросов и их обработкой
смотри на сущность в папке Entity
там есть Bucket и Flower.. у которых как раз отношение 1 к 1
и все прекрасно работает


У нас с тобой немного разные случаи. В твоем случае ты сам создаешь объект типа Bucket и сам устанавливаешь ему setFlower(). В моем случае объект создается с помощью JAXB, а в нем я пока не могу заставить сохранять ссылку на родительский элемент.

Пойду рыться в GitHub'e
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900550
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor

У нас с тобой немного разные случаи. В твоем случае ты сам создаешь объект типа Bucket и сам устанавливаешь ему setFlower(). В моем случае объект создается с помощью JAXB, а в нем я пока не могу заставить сохранять ссылку на родительский элемент.

Пойду рыться в GitHub'e


Вообще-то желательно чтобы было "мухи отдельно, котлеты отдельно".
Т.е. классы для генерации из/в XML это одно, а для работы с БД другое.
И для них написать прослойку для преобразования одного в другое.

И да. Для XML рекомендуется написать xsd, по ней (xsd) автогенерить классы и уже с ними работать.

Вот тогда будет настоящий "Кровавый Ынтырпрайз"!
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900560
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Почему один к одному так плох
1. потому что бд главная. А не java программист. А в бд одну таблу бить на две не выгодно никому. Ни базе, ни админу.
2. Первичный ключ PK. сложнее делать и там и там одновременно.
3. По опыту всех прогеров это геморой.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900563
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crunkor
Один объект, который имеет связи как OneToOne, так и OneToMany, а эти связи имеют еще свои связи и т.д. Я просто упростил для большей ясности.

Офигеть. Твоя задача не имеет решения.
Автомат невозможен.
Перевожу задачу:
- авторесть бд из 10 таблиц и 85 связями. С FK и каскадными. С двунаправленными.
То есть полноценная БД, но в XML и не в "ОРМ формате."
Нужно в автомате, не программируя, загнать ее в бд с другим хибер маппингом.

)))
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900730
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12

и отношение тут не one2one а one2many

Авторы с книгами соотнясятся как many2many ващет
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900740
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
apb12

и отношение тут не one2one а one2many

Авторы с книгами соотнясятся как many2many ващет

у одной книги несколько авторов?
ну впринципе да,но обычно это игнорируется -пишется просто первый автор и все
пример с литреса
,на обложке два автора,под книгой автор-название явно стянуты с базы и что там? верно 1 автор
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900747
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12,
Какие то ты говно книги читаешь))
http://prntscr.com/q8pmyl
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900749
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он блин ссылается что везде всю задачу упростил.
Связи упростил. Табла одна и т.д.
То есть дерево упростили и осталась одна палка - швабра из одной ветки.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900769
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12
у одной книги несколько авторов?
ну впринципе да,но обычно это игнорируется -пишется просто первый автор и все
... хотя (уметь) искать надо по всем авторам.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900801
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
apb12
у одной книги несколько авторов?
ну впринципе да,но обычно это игнорируется -пишется просто первый автор и все
... хотя (уметь) искать надо по всем авторам.

тоже верно
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900915
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
ну вот создал сейчас Many2Many и тут же словил грабли
у меня две таблицы юзер и книга
и хибер создает 3ю юзер_книга
вот я хочу из этой таблы юзер_книга удалить какую то запись и не пойму как это с помощью хибера делать?
писть через JPQL запрос ?из коробки хибер не сможет сам удалить?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900917
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12
из коробки хибер не сможет сам удалить?
может. Но надо три сущности. А не техническая табла из двух полей айдишников.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900921
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12

ну вот создал сейчас Many2Many и тут же словил грабли

А при чем техическая реализация какого-то фреймворка к правильности модели?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900926
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
я понял эсоздать новую сущность user_book а вот это все выпилить?
вообще чтоли убрать анотацию Many2Many?
или же там есть какая то хитрость

Код: java
1.
2.
3.
4.
5.
6.
7.
@ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
            name = "User_Book",
            joinColumns = { @JoinColumn(name = "user_id") },
            inverseJoinColumns = { @JoinColumn(name = "book_id") }
    )
    private List<Book>bookList;
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900927
apb12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
apb12

ну вот создал сейчас Many2Many и тут же словил грабли

А при чем техическая реализация какого-то фреймворка к правильности модели?

ну тоесть проще взять и написат новую сущность ,чем городить огород с этой анотацией @Many2Many?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900936
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apb12
ну тоесть проще взять и написат новую сущность ,чем городить огород с этой анотацией @Many2Many?
ну а куда каскад ты прилепил если слева и справа справочники. Удалять нельзя.
Проще сущность.
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39900996
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
А нельзя ли ваше с "настей" общение перенести в приват?
...
Рейтинг: 0 / 0
Как заставить Hibernate автоматически связывать объекты?
    #39903701
Crunkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, всем спасибо за помощь.
Из последнего примера мне стало окончательно ясно, что нужно что-то менять на этапе формирования самого объекта.
Т.к. за формирование объекта у меня отвечает JAXB, то было решено копать в его сторону. Всё, что мне нужно было - это указывать родителя в момент создания объекта.
В один из вечеров, во время поиска, я наткнулся на одну статью про JAXB, где увидел очень интересный метод afterUnmarshal с параметрами (Unmarshaller unmarshaller, Object parent ). В режиме дебага посмотрел, кто же приходит в него 2-м параметром и, как оказалось, это был действительно тот объект, который мне был нужен.

Добавил в сущностях методы типа
Код: java
1.
2.
3.
    void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        author = (Author ) parent;
    }


и всё заработало.

Возможно эта информация поможет кому-нибудь еще. Еще раз всем спасибо.
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate автоматически связывать объекты?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]