2011-07-16 21 views
1

我們的應用程序需要與另一個本地運行的應用程序共享一個現有的數據庫表,因此,我希望引用此表,但是跳過爲其生成DDL。我也希望將應用程序模式中的表定義爲別名或MySQL合併表,但我可以將其添加到將在生成的模式腳本之前運行的手動腳本。如何跳過超類表的模式生成? Java/JPA/Hibernate/Annotations/Maven/hbm2ddl

如何從myapp-schema-ddl.sql輸出中指定爲shared_schema表創建和更改表DDL是否被忽略?

從公共/ SRC /主/ JAVA/COM /公司/共享/ SharedSuperEntity.java:

@Entity 
@Table(name="shared_entity", catalog = "shared_schema") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class SharedSuperEntity { 
    // fields, etc... 
} 

從MYAPP/SRC /主/ JAVA/COM /公司/共享/ SharedSuperEntity.java:

@Entity 
@Table(name="local_entity", catalog = "local_schema") 
public class LocalEntity extends SharedSuperEntity { 
    // fields, etc... 
} 

從MYAPP/SRC /主/資源/ META_INF/persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<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_2_0.xsd" 
version="2.0"> 
<persistence-unit name="MyAppPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/LocalDS</jta-data-source> 
    <class>com.company.shared.SharedSuperEntity</class> 
    <class>com.company.myapp.LocalEntity</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <shared-cache-mode>NONE</shared-cache-mode> 
    <validation-mode>AUTO</validation-mode> 
    <properties> 
     <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
     <property name="hibernate.show_sql" value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.bytecode.use_reflection_optimizer" value="false" /> 
     <property name="hibernate.default_batch_fetch_size" value="4" /> 
     <property name="hibernate.default_entity_mode" value="pojo" /> 
     <property name="hibernate.generate_statistics" value="false" /> 
     <property name="hibernate.jdbc.batch_size" value="0" /> 
     <property name="hibernate.jdbc.batch_versioned_data" value="true" /> 
     <property name="hibernate.jdbc.fetch_size" value="0" /> 
     <property name="hibernate.jdbc.use_get_generated_keys" value="false" /> 
     <property name="hibernate.jdbc.use_scrollable_resultset" value="false" /> 
     <property name="hibernate.jdbc.use_streams_for_binary" value="false" /> 
     <property name="hibernate.hibernate.max_fetch_depth" value="3" /> 
     <property name="hibernate.order_updates" value="true" /> 
     <property name="hibernate.query.substitutions" value="true 1, false 0, yes 'Y', no 'N'" /> 
     <property name="hibernate.use_identifer_rollback" value="true" /> 
     <property name="hibernate.use_outer_join" value="false" /> 
     <property name="hibernate.use_sql_comments" value="false" /> 
     <property name="hibernate.id.new_generator_mappings" value="true" /> 
    </properties> 
</persistence-unit> 

從MYAPP/pom.xml的範圍內:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>hibernate3-maven-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <components> 
        <component> 
         <name>hbm2ddl</name> 
         <implementation>jpaconfiguration</implementation> 
        </component> 
       </components> 
       <componentProperties> 
        <persistenceunit>MyAppPU</persistenceunit> 
        <outputfilename>myapp-schema-ddl.sql</outputfilename> 
        <drop>false</drop> 
        <create>true</create> 
        <export>false</export> 
        <format>true</format> 
        <jdk5>true</jdk5> 
       </componentProperties> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-core</artifactId> 
        <version>3.6.0.Final</version> 
        <scope>compile</scope> 
       </dependency> 
       <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-entitymanager</artifactId> 
        <version>3.6.0.Final</version> 
        <scope>compile</scope> 
       </dependency> 
       <dependency> 
        <groupId>org.hibernate.javax.persistence</groupId> 
        <artifactId>hibernate-jpa-2.0-api</artifactId> 
        <version>1.0.0.Final</version> 
        <scope>compile</scope> 
       </dependency> 
       <dependency> 
        <groupId>mysql</groupId> 
        <artifactId>mysql-connector-java</artifactId> 
        <version>5.1.16</version> 
        <type>jar</type> 
        <scope>compile</scope> 
       </dependency> 
      </dependencies> 
     </plugin> 
+0

您已經正確指定了 true',但是您是否嘗試刪除' com.company.shared.SharedSuperEntity'? – ron190

回答

0

我不認爲Hibernate支持直接。您可以創建兩個配置文件:一個列出運行時的所有映射類,另一個省略模式生成的違規類。否則,您可能會查看某種後處理,如sed腳本,以便事後刪除DDL。

+0

Sed在我們的開發中使用的Windows箱子上的幾十個上不可用;我寧願在hibernate3:hbm2ddl執行的Maven階段處理這個問題。我聽說有一個XML映射只使用數據庫對象的hacky解決方法,但我們都使用註釋。我也聽說過一個名爲maven-replacer-plugin的maven插件,我希望能幫助我解決我的直接問題。 –

+0

@Tom:替代者插件看起來很有前途,因爲它支持正則表達式。在數據庫對象方面,XML不是唯一的方法,您可以在任何情況下將它與註釋映射一起使用。我寫了一篇[博客文章](http://blog.codehangover.com/536/),詳細介紹瞭如何在hibernate中使用輔助數據庫對象,如果您想查看該路線。 –

+0

謝謝瑞恩。允許通過Hibernate定義視圖對我來說似乎是一個有用的事情,恕我直言,應該被視爲一個功能增強。 –