Как пропустить генерацию схемы таблицы суперкласса? Java/JPA/спящий режим/аннотации/Maven/hbm2ddl

Нашему приложению необходимо совместно использовать существующую таблицу базы данных с другим локально работающим приложением, поэтому я хочу обратиться к этой таблице, но не создавать для нее DDL. Я также надеялся определить таблицу в схеме приложения как псевдоним или таблицу слияния MySQL, но я могу добавить это в ручной сценарий, который будет выполняться перед сгенерированным сценарием схемы.

Как я могу указать, что DDL создания и изменения таблицы для таблицы shared_schema исключен из выходных данных myapp-schema-ddl.sql?

Из commons/src/main/java/com/company/shared/SharedSuperEntity.java:

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

Из myapp/src/main/java/com/company/shared/SharedSuperEntity.java:

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

Из myapp/src/main/resources/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>

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

person Tom Harris    schedule 16.07.2011    source источник
comment
Вы правильно указали <exclude-unlisted-classes>true</exclude-unlisted-classes>, но пытались ли вы удалить <class>com.company.shared.SharedSuperEntity</class>?   -  person ron190    schedule 09.05.2017


Ответы (1)


Я не думаю, что Hibernate поддерживает это напрямую. Вы можете создать два конфигурационных файла: один, в котором перечислены все сопоставленные классы для среды выполнения, и один, в котором опущен класс-нарушитель для генерации схемы. В противном случае вы можете воспользоваться какой-либо постобработкой, например, сценарием sed, чтобы удалить DDL постфактум.

person Ryan Stewart    schedule 16.07.2011
comment
Sed недоступен на десятках компьютеров с Windows, которые использует наша разработка; Я бы предпочел справиться с этим на этапе Maven выполнения hibernate3:hbm2ddl. Я слышал, что существует хакерский обходной путь для XML-сопоставления с использованием объекта базы данных, но мы все настроены на использование аннотаций. Я также слышал о плагине maven с именем maven-replacer-plugin, который, как я надеюсь, поможет мне решить мою насущную проблему. - person Tom Harris; 17.07.2011
comment
@Tom: Плагин-заменитель выглядит многообещающе, поскольку поддерживает регулярные выражения. Что касается объекта базы данных, XML — не единственный способ сделать это, и вы можете использовать его вместе с отображением аннотаций в любом случае. Я написал сообщение в блоге, подробно описывающее, как использовать вспомогательные объекты базы данных в режиме гибернации, если вы хотите взглянуть на это. маршрут. - person Ryan Stewart; 17.07.2011
comment
Спасибо, Райан. Разрешение определения представлений через Hibernate кажется мне полезной вещью, и ИМХО следует рассматривать как улучшение функции. - person Tom Harris; 19.07.2011