Гибернация: указание столбцов в отношении «один ко многим» - PullRequest
6 голосов
/ 26 июня 2009

Я пытаюсь создать слой Hibernate для схемы базы данных, которую я практически не контролирую. Упрощенно, есть две таблицы.

Таблица parent имеет два важных столбца:

  • parent_id, целое число, первичный ключ, автоинкремент
  • parent_code, строка, уникальный ключ, сгенерированный где-то черным ящиком (допустим, это UUID для здравомыслия)
  • Плюс куча столбцов данных

Таблица child имеет два важных столбца:

  • child_parent_id, целое число, первичный ключ, автоинкремент
  • child_parent_code, строка, внешний ключ, указывающий на значение parent_code родителя
  • Плюс куча столбцов данных

Я хочу иметь возможность вызывать Parent.getChilds () и получать объекты Collection of Child. Но настройка файлов отображения Hibernate кажется невозможной. В приведенных ниже сопоставлениях выполняется поиск в таблице child со значением parent_id (вместо parent_code).

В Parent.hbm.xml:

    <set name="childs" inverse="true" lazy="true" table="child" fetch="select">
        <key>
            <column name="child_parent_code" not-null="true" />
        </key>
        <one-to-many class="foo.bar.Child" />
    </set>

В Child.hbm.xml:

    <many-to-one name="parent" class="foo.bar.Parent" fetch="select">
        <column name="child_parent_code" not-null="true" />
    </many-to-one>

Я потратил час на просмотр своей копии Java Persistence с Hibernate , но я не могу понять, как делать то, что я хочу. Возможно ли это?

Ответы [ 2 ]

12 голосов
/ 26 июня 2009

Я хотел бы рассмотреть возможность использования спящих аннотаций. Я обнаружил, что с ними гораздо проще работать с определениями xml.

Вот код в формате аннотации:

@Entity
@Table(name="parent")
public class Parent
{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @ManyToOne
        @JoinColumn(name="child", referencedColumnName = "id")
    private Child child;
}

@Entity
@Table(name = "child")
public class Child
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int id;

    @Column(name = "code")
    public String code;
}
4 голосов
/ 26 июня 2009

Попробуйте что-то подобное в родительском:

<set name="childs" inverse="true" lazy="true" table="child" fetch="select">
    <key column="child_parent_code" property-ref="code" />
    <one-to-many class="foo.bar.Child" />
</set>

а это у ребенка:

<many-to-one name="parent" class="foo.bar.Parent"
    fetch="select" column="child_parent_code" property-ref="code" />

Я предположил, что свойство кода в родительском элементе называется "код".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...