2013-01-04 7 views
5

nawiązanie pytanie do mojego poprzedniego pytania: Generate an SQL DB creation script with Hibernate 4Hibernate SchemaExport i Trwałość jednostka

Celem jest mieć narzędzie wiersza poleceń w stanie wygenerować plik ze schematem SQL jednostki podane trwałości (podobnie jak w hibernatetool- Zadanie ant Hbm2ddl obecne w narzędziach Hibernuj).

To, zgodnie z odpowiedzią na moje poprzednie pytanie, można uzyskać pod numerem org.hibernate.tool.hbm2ddl.SchemaExport.

Zamiast dodawać wszystkie elementy do Configuration (zgodnie z sugestią z poprzedniej odpowiedzi), chciałbym podać PersistenceUnit.

Czy jest możliwe dodać urządzenie utrwalające do Hibernacji Configuration?

Coś

Properties properties = new Properties(); 
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
... 
EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory("persistentUnitName", properties); 
Configuration configuration = new Configuration(); 

... missing part ... 

SchemaExport schemaExport = new SchemaExport(configuration); 
schemaExport.setOutputFile("schema.sql"); 
... 

Edit na żądanie w komentarzach próbki persistence.xml. Każda klasa jest opatrzone @Entity

<persistence 
    xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0" 
> 

    <persistence-unit 
     name="doiPersistenceUnit" 
     transaction-type="JTA" 
    > 

     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>jdbc/doi</jta-data-source> 


     <class>ch.ethz.id.wai.doi.bo.Doi</class> 
     [...] 
     <class>ch.ethz.id.wai.doi.bo.DoiPool</class> 

     <exclude-unlisted-classes>true</exclude-unlisted-classes> 

     <properties> 
      <property name="hibernate.show_sql"      value="false" /> 
      <property name="hibernate.format_sql"     value="false" /> 
      <property name="hibernate.connection.characterEncoding" value="utf8" /> 
      <property name="hibernate.connection.charSet"   value="utf8" /> 
     </properties> 

    </persistence-unit> 

</persistence> 
+0

, więc chcesz zapisać linie 'config.addAnnotatedClass (MyMappedPojo1.class);'? – yair

+0

@yair tak Chciałbym uniknąć ręcznego określania wszystkich klas (i unikania ich do twardego kodu). Wiem, że mógłbym parsować plik persistence.xml, ale podejrzewam, że jest łatwiejszy sposób. – Matteo

+0

Myślę, że brakuje ci również przekazywania dialektu do konfiguracji - nie powiedzie się, gdy zostanie utworzony SchemaExport. – kboom

Odpowiedz

6

Dobrze, jeśli zajęcia są odwzorowywane za pośrednictwem odwzorowań XML (hbm S) - można dodać documnets lub pliki jar, które obejmują plików XML prosto do instancji Configuration wykorzystaniem config.addJar(myJarFile) i config.add(myXmlFile).

Jednakże, jeśli chcesz, aby adnotacją zajęcia mają być skanowane - Nie znam takiego prostego wyboru przez Hibernate (addPackage dodaje metadane i nie klas).

Ty może zaimplementować własną logikę skanowania i dodać wszystkie klasy z adnotacją config.addAnnotatedClass(myAnnotatedClass) (lub może to zrobić za specyficzne dla pakietów zawierających wiesz ty ORM klas, a więc może zaoszczędzić trochę czasu).

UPDATE 2

Och, jeszcze lepiej, można po prostu iteracyjne jednostki Trwałość za ManagedType s poprzez getManagedTypes():

EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory(unitName, config.getProperties()); 
final Set<ManagedType<?>> managedTypes = 
    entityManagerFactory.getMetamodel().getManagedTypes(); 
    for (ManagedType<?> managedType : managedTypes) { 
    final Class<?> javaType = managedType.getJavaType(); 
    config.addAnnotatedClass(javaType); 
} 

UPDATE

można określić PersistenceUnit każdego Entity - bez parsowania xml - sprawdzając poczet EntityManagerFactory:

Class aClass = ... // get the class from your scanning 
EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory(unitName, config.getProperties()); 
ManagedType<?> managedType = null; 
try { 
    managedType = entityManagerFactory.getMetamodel().managedType(aClass); 
} catch (IllegalArgumentException e) { 
    // happens when aClass isn't a type managed by the persistence unit 
} 
if (managedType != null) { 
    config.addAnnotatedClass(aClass); 
} 

Upewnij się, aby korzystać z różnych Configuration instancji dla każdej jednostki trwałości. W przeciwnym razie po prostu akumulowałyby się adnotowane klasy, a więc także DDL.

Wypróbowałem to i działało świetnie - wydrukowałem dwa różne pliki DDL dla dwóch różnych jednostek wytrwałości.

+0

zajęcia są opisywane. Skanowanie plików jar pod adnotacjami może być opcją, ale nadal musiałbym przeanalizować składnię plików persistence.xml, aby wiedzieć, do której jednostki trwałości dany element \ @Entity należy do – Matteo

+0

@Matteo, czy mógłbyś opublikować swój plik 'persistence.xml'? – yair

+0

nie ma jednego pliku persistence.xml, ale wiele z nich (stąd potrzeba mojego narzędzia) Dodam jeden przykład. – Matteo