Как отобразить в поле XML List <Entity>с Hibernate - PullRequest
0 голосов
/ 14 сентября 2009

Я гуглил весь день и не могу найти ни одного хорошего примера, как отобразить объекты такого типа:

class Parent{
    private Integer parentId;
    private String parentName;
    private List<Child> childs;

    // ....... getters and setters ............
}

class Child{
    private Integer childId;
    private String childName;

    private Parent parent;

    // ....... getters and setters ...........
}

Я понятия не имею, как составить карту для этого вида Списка.

Ответы [ 2 ]

1 голос
/ 14 сентября 2009

Документация Hibernate содержит множество примеров , в том числе этот , который, в основном, то, что вы ищете. XML-отображение для вашего случая будет выглядеть так:

<class name="Parent" table="Parent">
  <id name="parentId" column="id" type="integer" /> <!-- TODO: specify generator -->
  <property name="parentName" type="string" column="name" />
  <bag name="childs" table="Children" inverse="true">
    <key column="parent_id" />
    <one-to-many class="Child" />
  </bag>
</class>

<class name="Child" table="Children">
  <id name="childId" column="id" type="integer" /> <!-- TODO: specify generator -->
  <property name="childName" type="string" column="name" />
  <many-to-one name="parent" column="parent_id" not-null="true"/>
</class>

Примеры карт на основе аннотаций можно найти здесь

0 голосов
/ 14 сентября 2009

Прежде всего, вы должны объявить свой List<Child> как IList<Child>, потому что NHibernate должен иметь возможность использовать свой собственный тип коллекции, который реализует IList.

В вашем отображении вы должны использовать элемент 'bag' для отображения вашего Списка. (Вы уверены, что хотите использовать Список, а не Набор? Поскольку Список позволяет, чтобы одна единственная сущность встречалась в списке более одного раза, тогда как Набор не допускает этого).

Вот как я должен это сделать:

public class Parent
{
   private IList<Child> _children = new List<Child>();

   public ReadOnlyCollection<Child> Children
   {
       get {return _children.AsReadOnly();}
   }
}

И отображение:

<class name="Parent" table="Parent">
    <list name="Children" table="..." access="field.camelcase-underscore" inverse="true">
        <key column="..." />
        <one-to-many class="Child" />
    </list>
</class>

(для краткости опущены все остальные свойства)

(Ой, теперь, когда я это вижу, вы используете Hibernate? Мой пример кода на C #, поэтому я не знаю, есть ли у вас понятие ReadOnlyCollection и т. Д ...)

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