2012-04-24 2 views
1

Предположим, что у меня есть отношение Master Slave. В базе данных существует одна строка в таблице Master с id = 1. Почему этот следующий код работает:Почему ссылка на удаленный объект работает? Jpa hibernate

Slave slave = new Slave(); 
    slave.setId(1L); 

    Master master = new Master(); 
    master.setId(1L); 
    slave.setMaster(master); 
    em.persist(slave); 

Так Master отсоединяется сущность и после совершения refence между ведомым и мастером создается. Зачем? Я хотел бы, чтобы в этом случае мы должны были прочитать строку Master из базы данных с помощью функции «Найти». Где я могу узнать больше об этом?

+0

Какова ваша граница транзакции? Как аннотируются ваши сущности? Если вы хотите прочитать больше - прочитайте спецификацию JPA 2.0. –

+0

В этом случае JPA использует только данный идентификатор мастера. JPA с радостью вставляет вновь созданный ведомый, потому что в таблице уже есть Мастер с идентификатором 1L. –

ответ

1

Добро пожаловать в темную землю отношений Hibernate. Прежде всего, если вы хотите узнать, что происходит добавить в свой hibernate.cfg.xml

<property name="show_sql">true</property> 

Благодаря тому, что вы видите на консоли все запросы SQL, выполняемые Hibernate для вас - это лучший способ фигуры как Hibernate работает в данный момент.

Назад к вашему неожиданному результату. Важно то, кто владеет отношениями. В вашем случае я предполагаю, что в таблице Slave есть внешний ключ, который указывает на первичный ключ главной таблицы (очевидно, вы можете использовать также таблицу join - не имеет значения).

Hibernate, создавая отношения, заботится только об этой стороне, которой принадлежит отношение - в вашем случае достаточно сохранить информацию о новых отношениях в таблице Slave. Фактически, Мастер не должен знать об отношении, поэтому нет необходимости вызывать сохранение этого объекта. Вот почему ваш код работает.

полезное чтение:

+0

Я удивлен, что спящий режим не проверяет, управляется ли главная сущность. – dpolaczanski

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