Проблема с обратным проектированием однонаправленной ассоциации «многие к одному» с инструментами гибернации.


Я использую Hibernate tools 3.40 в Eclipse (Helios). Я пытаюсь сгенерировать POJO из моей БД (MSSQL 2008) в стиле EJB3 (т.е. аннотации JPA2.0).
Допустим, у меня есть две таблицы A и B, где есть внешний ключ от A до B.
Это генерирует по умолчанию POJO для A, в котором B является членом (его «родителем»), и POJO для B, в котором Set<A> является членом (его «дочерними элементами»).
Что мне нужно? заключается в том, чтобы знать, как я могу контролировать rev-eng, чтобы создавалась только одна сторона ассоциации (у меня разные варианты использования, поэтому в основном для меня важны все три варианта).
Я не хочу использовать hbm.xml файлы, поскольку я работаю с аннотациями и JPA2.0, но я могу указать некоторые метаданные в процессе обратного проектирования для перехода в спящий режим через hibernae.reveng.xml

Я попытался настроить атрибут foreign-key и определить там exclude=true, но это дало мне только половину ответа для одного сценария. Это сгенерировало A POJO с членом bPK int, что допустимо и понятно, но сгенерированный POJO B теперь не компилируется, так как аннотация one-to-many имеет недопустимый атрибут; mappedby="unresolved" из-за того, что A больше не имеет свойства, на которое можно сопоставить hibernate reveng.

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


person Ittai    schedule 09.03.2011    source источник


Ответы (2)


Создайте класс для reveng. strategy в Hibernate Code Generation Configuration

Пример :

public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {

   public MyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) {
       super(delegate);
   }

   @Override
   public void setSettings(ReverseEngineeringSettings settings) {
       super.setSettings(settings);
   }

   @Override
   public boolean excludeForeignKeyAsCollection(String keyname, 
    TableIdentifier fromTable, java.util.List fromColumns, 
    TableIdentifier referencedTable, java.util.List referencedColumns) {

    // TODO : Your work here
    if (keyname.equals("___") && 
        fromTable.getName().equals("___") && 
        fromColumns.contains("___") && 
        referencedTable.getName().equals("___") && 
        referencedColumns.contains("___")) {

        return true;
    }

    return false;
   }
}

JavaDoc для метода excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

а также есть еще один вызов метода excludeForeignKeyAsManytoOne

Should this foreignkey be excluded as a many-to-one 
person lschin    schedule 11.03.2011
comment
Большое спасибо. Я бы хотел, чтобы был лучший способ сделать это, чем жестко закодировать эти требования в этом малоизвестном классе, но, по крайней мере, это рабочее решение. - person Ittai; 11.03.2011
comment
У меня та же проблема, но ваш ответ специфичен для ___, это не общий ответ. Спасибо, в любом случае - person Kummo; 31.05.2013

В настоящее время (проверено с помощью Hibernate Tools 5.2) работает генерация однонаправленных операций "многие к одному".

В документации (https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile), вы видите, что можете исключить некоторые стороны отношений:

Например (переименование свойств)

 <!-- control many-to-one and set names for a specific named foreign key constraint -->
 <foreign-key constraint-name="ORDER_CUST">
   <many-to-one property="customer"/>
   <set property="orders"/>
 </foreign-key>

Или (исключая свойства)

 <!-- can also control a pure (shared pk) one-to-one  -->
  <foreign-key constraint-name="ADDRESS_PERSON">
   <one-to-one exclude="false"/>
   <inverse-one-to-one exclude="true"/>
  </foreign-key>

Итак, чтобы иметь только одну сторону отношений только с @ManyToOne, вы можете сделать следующее:

<table name="city" schema="public">
    <primary-key property="id">
        <key-column name="id" type="integer"/>
    </primary-key>
</table>

<table name="country" schema="public">
    <foreign-key constraint-name="country_capital_fkey" foreign-schema="public">
        <many-to-one property="capital" exclude="false"/>
        <set exclude="true" />
    </foreign-key>
</table>

Вы также можете получить экземпляр моей тестовой базы данных с помощью Docker здесь:

docker pull ghusta/postgres-world-db:2.1

person Guillaume Husta    schedule 23.06.2017