powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate автоматически связывать объекты?
25 сообщений из 78, страница 2 из 4
Как заставить 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
25 сообщений из 78, страница 2 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate автоматически связывать объекты?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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