Hibernate композитный ключ и внешний генератор - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь заставить внешний ключ дочернего класса автоматически получить идентификатор его родителя.

Дочерний класс:

public class Child implements Serializable 
{
    // primary (composite) key 
    private int parentId; // I want this to be set automatically
    private String name;

    // random value
    private String val;

    public Child(String name, String val) {
       this.name = name;
       this.val = val;
    }

    public void setParentId(int id) {

    [...]
}

Родительский xml:

<map name="children" inverse="true" lazy="true" cascade="all,delete-orphan"> 
    <cache usage="nonstrict-read-write"/>
    <key column="parent_id"/>
    <index column="child_name" type="string"/> 
   <one-to-many class="myPack.Child"/>
</map>

Дочерний xml:

<class name="Child" table="child_tbl" lazy="true">

    <composite-id>
        <key-property name="ParentId" type="int" column="parent_id"/>
        <key-property name="Name" column="name" type="string"/>
        <generator class="foreign">
            <param name="property">ParentId</param>
        </generator>
    </composite-id>

    <property name="Val" blablabla
[...]

Однако это не удается с:

HibernateException: Невозможно разрешить свойство: ParentId

Поддерживает ли Hibernate сторонние генераторы для составных идентификаторов?Или тот факт, что родительский класс содержит карту, является проблемой?

1 Ответ

1 голос
/ 13 октября 2011

Я попробовал это сам, и у меня это сработало

Определение класса

Обратите внимание, что дочерний класс должен реализовывать методы equals() и hashCode().

public class Parent {

    private int id;
    private String name;

//...getter setter methods
}


public class Child implements Serializable{

    private Parent parent;
    private String name;

      public boolean equals(Object c){
         //implement this
      }

      public int hashCode(){
           //implement this
      } 

//..getter setter methods
}

Hibernate Mapping

Примечание:

  1. Отображение для родителя не отображается
  2. отображение many-to-one между дочерним элементом и родительским элементом установлено на unique="true", что указывает one-to-one отношение
  3. insert="false" и update="false", поскольку столбец используется как composite-id.

Отображение дочерних классов:

<class name="Child" table="CHILD" dynamic-update="true">
    <composite-id>
         <key-property name="name"></key-property>
     <key-many-to-one name="parent" class="Parent" column="id"/>
    </composite-id>
    <many-to-one name="parent" class="Parent" 
           unique="true" column="id" insert="false" update="false" />
</class>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...