У меня есть класс A, обладающий свойством класса B.
Таблица SQL для A ничего не знает о B.
Таблица SQL для B содержит внешний ключ для A.
Как я могу сопоставить (в hbm.xml) так, что B является свойством A? Я знаю, как это сделать с помощью Sets:
<set name="b" table="B" cascade"all-delete-orphan">
<key column="a_id">
<composite-element class="B">
<property name="bProp" column="b_prop" type="string"/>
</composite-element>
</set>
Вещь, B не является набором A. Скорее всего один элемент. Как я могу это сделать?
Изменить. Чтобы немного уточнить, мой вариант использования похож на http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/associations.html#assoc-unidirectional-m21, за исключением:
create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )
У меня есть:
create table Person ( personId bigint not null primary key )
create table Address ( personId bigint, addressId bigint not null primary key )
Однако я ожидал бы, что фактический класс адресов не содержит ссылок на Person:
class Person {
Address address;
}
class Address {
int id;
}
Мне не особенно нравится это решение, но вы можете обойти проблему, используя пару методов обертки. Создайте поддельную пару getter/setter для неотображенного свойства, которое даст вам необходимый интерфейс. Таким образом:
public class Person {
private List<Address> addresses;
// properties, real getters and setters
public Address getAddress() {
if (this.addresses == null || this.addresses.isEmpty()) {
return null;
}
return this.addresses.get(0);
}
public void setAddress(Address address) {
if (this.addresses == null) {
this.addresses = new ArrayList<Address>();
}
this.addresses.clear();
this.addresses.add(address);
}
}
Если у кого-то еще есть проблемы с подобной ситуацией, я, наконец, понял это. Просто сопоставьте вторую таблицу, используя
<join table="Address">
<key column="personId">
<component name="address" class="Address">
<property name="id" column="addressId" type="int" />
</component>
</key>
</join>