2013-01-04 176 views
5

一個後續問題我剛纔的問題:Generate an SQL DB creation script with Hibernate 4休眠的SchemaExport和持久性單元

的目標是有能夠產生與給定的持久性單元(同樣的SQL架構到hibernatetool-文件中的命令行工具就是hbm2ddl螞蟻出現在休眠的工具任務)。

根據我對上一個問題的回答,可以用org.hibernate.tool.hbm2ddl.SchemaExport來實現。

而不是將所有實體添加到Configuration(如前面的答案中所建議的),我想指定一個PersistenceUnit

是否有可能加入休眠單元休眠Configuration

喜歡的東西

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"); 
... 

編輯作爲評論的樣品persistence.xml要求。每個類都被註解@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

所以你想保存'config.addAnnotatedClass(MyMappedPojo1.class);'行? – yair

+0

@yair是的我想避免手動指定所有的類(並避免對它們進行硬編碼)。我知道我可以解析persistence.xml文件,但我懷疑有一種更簡單的方法。 – Matteo

+0

我想你也錯過了將方言傳遞給配置 - 當SchemaExport被創建時它會失敗。 – kboom

回答

6

好了,如果你的類是通過XML映射(hbm S)映射 - 您可以添加包括個XML直接使用config.addJar(myJarFile)config.add(myXmlFile)Configuration實例documnets或jar文件。

但是,如果你希望你的註解類進行掃描 - 我知道通過Hibernate沒有這種直接的選項(addPackage添加元數據和類)。

可能實現自己的掃描邏輯,並與config.addAnnotatedClass(myAnnotatedClass)添加註釋的所有類(或者做每您知道包含您ORM類,因此可能節省一些時間特定的包)。

更新2

哦,更妙的是,你可以通過getManagedTypes()迭代持久性單元的ManagedType S:

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

您可以確定每個PersistenceUnitEntity - 不必解析XML - 通過檢查對相關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); 
} 

確保使用不同Configuration情況下,對每個持久性單元。否則,註釋類將會累積,DDL也會累積。

我試過了,它效果很好 - 爲兩個不同的持久性單元打印了兩個不同的DDL。

+0

這些類是註釋。掃描註釋的jar文件可能是一個選項,但我仍然必須分析解析persistence.xml文件,以知道給定的@ @Entity屬於哪個持久性單元 – Matteo

+0

@Matteo可以請您發佈您的'persistence.xml'嗎? – yair

+0

沒有單個persistence.xml,但其中很多(因此需要我的工具)我將添加一個示例。 – Matteo