2011-03-09 15 views
5


Używam narzędzi Hibernuj 3.40 w Eclipse (Helios). Próbuję generować POJO z mojego DB (MSSQL 2008) w stylu EJB3 (tj. Adnotacje JPA2.0).
Powiedzmy, że mam dwie tabele A i B, gdzie jest klucz obcy od A do B.
Generuje to domyślnie POJO dla A, który ma B jako członka (jego "nadrzędny") i POJO dla B, który ma Set<A> jako członka (jego "dzieci").
Chciałbym wiedzieć, w jaki sposób mogę kontrolować rev-eng, aby utworzyć tylko jedną stronę powiązania (mam różne przypadki użycia, więc zasadniczo wszystkie trzy opcje są dla mnie ważne).
Nie chcę używać plików hbm.xml jak pracuję z adnotacji i JPA2.0 ale mogę podać jakieś metadane na temat procesu inżynierii odwrotnej do hibernacji poprzez hibernae.reveng.xmlProblem z inżynierią wsteczną skojarzenia wielu do jednego z narzędziami hibernacji

Próbowałam konfigurowanie atrybutu foreign-key i definiowanie tam wartości exclude=true, ale zapewniało to tylko połowę odpowiedzi dla jednego scenariusza. To wygenerowało POJO A z elementem int bPK, które jest znośne i zrozumiałe, ale wygenerowany obiekt POJO o numerze B nie został skompilowany, ponieważ adnotacja one-to-many ma nieprawidłowy atrybut; Numer mappedby="unresolved" ze względu na to, że A nie ma już właściwości, której hibernacja odsłania, może być odwzorowany.

Obecnie nie mogę tworzyć stowarzyszeń jednokierunkowych i byłbym wdzięczny za każdą pomoc.

Odpowiedz

3

Tworzenie klasy dla reveng. strategy w Hibernate Code Generation Configuration

przykład:

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 dla metody excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

i tam też inne połączenia metody excludeForeignKeyAsManytoOne

Should this foreignkey be excluded as a many-to-one 
+1

dzięki. Szkoda, że ​​nie było lepszego sposobu, aby to zrobić, niż aby zakodować te wymagania w tej "niejasnej" klasie, ale przynajmniej jest to działające rozwiązanie. – Ittai

+0

Mam ten sam problem, ale twoja odpowiedź jest specyficzna dla "___", nie jest to odpowiedź ogólna. Dzięki i tak – Kummo

0

Obecnie (testowany przy użyciu Hibernuj Tools 5.2), generowanie jednokierunkowych prac "wiele do jednego".

W dokumentacji (https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile), można zobaczyć, że można wykluczyć jakąś stronę zależność:

Na przykład (Właściwości zmiana nazwy)

<!-- 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> 

lub (właściwości wyłączeniem)

<!-- 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> 

Aby mieć tylko jedną stronę relacji tylko z @ManyToOne, można wykonać następujące czynności:

<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> 

Można również pobrać wystąpienie mojej przykładowej bazy danych z Döcker tutaj:

doker ciągnąć ghusta/postgres'owy-world-db: 2.1