2013-08-31 6 views
1

Во-первых, я прочитал Hibernate - One table with multiple entities?.Hibernate - одна таблица нескольких объектов

Однако, я хотел бы сопоставить два объекта в одной таблице, но я хотел бы, чтобы оба они были объектами, из которых я могу выбрать. Что я имею в виду:

  • Один стол: лицо (идентификатор, имя, датаOfBirth, город, улица, почтовый индекс).
  • Два объекта: лицо (id, name, dateOfBirth), адрес (id, city, street, zipcode).

Так что это отношения 1: 1 между объектами, но все же 1 таблица в БД.

Если я использую предлагаемое решение (ключевое слово компонента) в приведенной выше ссылке, я не могу напрямую запросить адрес (я могу получить к нему доступ через объект Person). И я хочу быть в состоянии сделать

session.createCriteria(Adres.class) 

Как это сделать?

UPDATE: Я попытался ассоциацию один-к-одному между сущностями, в адрес отображения:

<one-to-one name="Person " class="model_mapowanie_xml.Person "/> 

и Person отображения:

<one-to-one name="Address" class="model_mapowanie_xml.Address "/> 

Оба класса имеют поля со ссылкой на другую один. Выбор записей отлично подходит для этого. Однако, как я могу добавить в одну транзакцию запись с использованием обоих объектов? (Id генерируется db)

Address ad = new Address(); 
ad.setProperty("Sydney"); 
Person p = new Person(); 
p.setProperty("John"); 
p.setAddress(ad); 
session.save(p); 

и только часть человека сохранена, свойство адреса остается пустым.

+0

Использование критериев апите запрос для объекта. –

ответ

1

Вы должны быть в состоянии сделать это, используя аннотацию @Table. Эти заявки будут рассматриваться как разные, но будут отображаться на одну таблицу.

@Entity 
@Table(name="PERSON_TABLE") 
class Person {} 


@Entity 
@Table(name"PERSON_TABLE") 
class Address {} 

Edit:

Если вы хотите сохранить как объекты в одной транзакции вы либо должны явно сохранить их с помощью Session или установить cascade свойство каскадом операций на отношениях. Я думаю, вы хотите каскадировать операции над адресом, когда вы делаете что-то на Лице. См. CascadeType, если вы используете аннотации.

В вашем HBM это будет выглядеть <one-to-one name="Person" class="model_mapowanie_xml.Person" cascade="all"/>

+0

, который дал мне идею, вопрос обновлен –

+0

Должны ли у каждого объекта [Лицо и адрес] свой собственный идентификатор? – IllSc