Hibernate: как мне сопоставить один, где B является свойством A?

1

У меня есть класс 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;
}
  • 0
    В вашем примере, поскольку дочерний класс (Address) имеет ссылку внешнего ключа на родителя (Person), на самом деле это отношение «один ко многим» от Person к Address. Эта схема, в частности, указывает, что человек может иметь более одного адреса, но каждый адрес принадлежит только одному человеку.
  • 0
    Да, я понимаю. Я говорил об этом с моими товарищами по команде, но кажется, что слишком много кода зависит от таблиц БД, оставаясь такими, какие они есть. Будет ли все еще возможно отобразить его как отдельный элемент, а не как набор?
Показать ещё 3 комментария
Теги:
hibernate

2 ответа

1
Лучший ответ

Мне не особенно нравится это решение, но вы можете обойти проблему, используя пару методов обертки. Создайте поддельную пару 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);
    }
}
  • 0
    Ой, определенно не слишком без ума от этого решения, но это лучше, чем ничего. Спасибо чувак.
0

Если у кого-то еще есть проблемы с подобной ситуацией, я, наконец, понял это. Просто сопоставьте вторую таблицу, используя

<join table="Address">
    <key column="personId">
        <component name="address" class="Address">
            <property name="id" column="addressId" type="int" />
        </component>
    </key>
</join>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню