2013-01-04 6 views
5

Một câu hỏi followup cho câu hỏi trước đây của tôi: Generate an SQL DB creation script with Hibernate 4Hibernate SchemaExport và Persistence đơn vị

Mục đích là để có một công cụ dòng lệnh có thể tạo ra một tập tin với schema SQL của một đơn vị kiên trì nhất định (tương tự như hibernatetool- hbm2ddl Ant nhiệm vụ hiện diện trong các công cụ Hibernate).

Điều này, theo câu trả lời cho câu hỏi trước của tôi, có thể đạt được với org.hibernate.tool.hbm2ddl.SchemaExport.

Thay vì thêm tất cả các thực thể vào Configuration (như được đề xuất trong câu trả lời trước) tôi muốn chỉ định một PersistenceUnit.

Có thể thêm đơn vị liên tục vào Hibernate Configuration?

Something như

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

Sửa theo yêu cầu trong các ý kiến ​​một mẫu persistence.xml. Mỗi lớp được chú thích với @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

để bạn muốn lưu 'config.addAnnotatedClass (MyMappedPojo1.class);' dòng? – yair

+0

@yair yes Tôi muốn tránh chỉ định tất cả các lớp theo cách thủ công (và tránh mã hóa chúng một cách thủ công). Tôi biết tôi có thể phân tích cú pháp tệp persistence.xml nhưng tôi nghi ngờ có một cách dễ dàng hơn. – Matteo

+0

Tôi nghĩ rằng bạn đang thiếu cũng đi qua phương ngữ vào cấu hình - nó sẽ thất bại khi SchemaExport được tạo ra. – kboom

Trả lời

6

Vâng, nếu lớp học của bạn được ánh xạ qua ánh xạ xml (hbm s) - bạn có thể thêm documnets hoặc các tập tin jar bao gồm các XMLs thẳng đến Configuration dụ sử dụng config.addJar(myJarFile)config.add(myXmlFile).

Tuy nhiên, nếu bạn muốn chú thích lớp học của bạn được quét - Tôi biết không có lựa chọn đơn giản như vậy thông qua Hibernate (addPackage thêm siêu dữ liệu và không lớp).

Bạn thể thực hiện logic quét của riêng bạn và thêm tất cả các lớp học chú thích với config.addAnnotatedClass(myAnnotatedClass) (hoặc có lẽ làm điều đó mỗi gói cụ thể mà bạn biết để chứa bạn ORM lớp và do đó có thể tiết kiệm thời gian).

UPDATE 2

Oh, thậm chí tốt hơn, bạn có thể chỉ cần lặp đơn vị kiên trì của ManagedType s qua 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); 
} 

CẬP NHẬT

Bạn có thể xác định PersistenceUnit của mỗi Entity - mà không phân tích cú pháp xml - bằng cách kiểm tra chống lại liên quan 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); 
} 

Hãy chắc chắn để sử dụng khác nhau Configuration trường hợp đối với từng đơn vị bền vững. Nếu không, các lớp được chú thích sẽ chỉ tích lũy và DDL cũng vậy.

Tôi đã thử nó và nó hoạt động tốt - in hai DDL riêng biệt cho hai đơn vị bền vững khác nhau.

+0

các lớp được chú thích. Việc quét các tệp jar cho chú thích có thể là một tùy chọn nhưng tôi vẫn phải phân tích cú pháp phân tích các tệp persistence.xml để biết đơn vị kiên trì nào đã cho \ @Entity thuộc về – Matteo

+0

@Matteo, bạn có thể đăng 'persistence.xml' của mình không? – yair

+0

không có duy nhất persistence.xml nhưng nhiều người trong số họ (do đó sự cần thiết cho công cụ của tôi) Tôi sẽ thêm một ví dụ. – Matteo