Java 从JPA注释实体类自动生成数据模式

Java 从JPA注释实体类自动生成数据模式,java,database,hibernate,jpa,jakarta-ee,Java,Database,Hibernate,Jpa,Jakarta Ee,我正在使用JPA(Hibernate的实现)注释实体类,以便持久化到关系数据库(MySQL或SQL Server)。有没有一种简单的方法可以从带注释的类自动生成数据库模式(表创建脚本) 我仍处于原型阶段,预计模式会频繁更改。我希望能够从带注释的代码中指定和更改数据模型。Grails的相似之处在于它从域类生成数据库。您可以从Hibernate使用。这些文档是。作为相关说明:可以找到使用EclipseLink JPA生成数据库架构的文档。为给定JPA实体生成创建和删除脚本。 我们使用此代码生成dro

我正在使用JPA(Hibernate的实现)注释实体类,以便持久化到关系数据库(MySQL或SQL Server)。有没有一种简单的方法可以从带注释的类自动生成数据库模式(表创建脚本)


我仍处于原型阶段,预计模式会频繁更改。我希望能够从带注释的代码中指定和更改数据模型。Grails的相似之处在于它从域类生成数据库。

您可以从Hibernate使用。这些文档是。

作为相关说明:可以找到使用EclipseLink JPA生成数据库架构的文档。

为给定JPA实体生成创建和删除脚本。

我们使用此代码生成drop和create语句: 只要用所有实体类构造这个类,并调用create/dropTableScript

如果需要,可以使用persistence.xml和persistence单元名称。说点什么 我也发代码

import java.util.Collection;
import java.util.Properties;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.dialect.Dialect;
import org.hibernate.ejb.Ejb3Configuration;

/**
 * SQL Creator for Tables according to JPA/Hibernate annotations.
 *
 * Use:
 *
 * {@link #createTablesScript()} To create the table creationg script
 *
 * {@link #dropTablesScript()} to create the table destruction script
 * 
 */
public class SqlTableCreator {

    private final AnnotationConfiguration hibernateConfiguration;
    private final Properties dialectProps;

    public SqlTableCreator(final Collection<Class<?>> entities) {

        final Ejb3Configuration ejb3Configuration = new Ejb3Configuration();
        for (final Class<?> entity : entities) {
            ejb3Configuration.addAnnotatedClass(entity);
        }

        dialectProps = new Properties();
        dialectProps.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");

        hibernateConfiguration = ejb3Configuration.getHibernateConfiguration();
    }

    /**
     * Create the SQL script to create all tables.
     * 
     * @return A {@link String} representing the SQL script.
     */
    public String createTablesScript() {
        final StringBuilder script = new StringBuilder();

        final String[] creationScript = hibernateConfiguration.generateSchemaCreationScript(Dialect
                .getDialect(dialectProps));
        for (final String string : creationScript) {
            script.append(string).append(";\n");
        }
        script.append("\ngo\n\n");

        return script.toString();
    }

    /**
     * Create the SQL script to drop all tables.
     * 
     * @return A {@link String} representing the SQL script.
     */
    public String dropTablesScript() {
        final StringBuilder script = new StringBuilder();

        final String[] creationScript = hibernateConfiguration.generateDropSchemaScript(Dialect
                .getDialect(dialectProps));
        for (final String string : creationScript) {
            script.append(string).append(";\n");
        }
        script.append("\ngo\n\n");

        return script.toString();
    }
}
import java.util.Collection;
导入java.util.Properties;
导入org.hibernate.cfg.AnnotationConfiguration;
导入org.hibernate.dialogue.dialogue;
导入org.hibernate.ejb.ejb3配置;
/**
*根据JPA/Hibernate注释创建表的SQL创建者。
*
*使用:
*
*{@link#createTablesScript()}来创建表创建脚本
*
*{@link#dropTablesScript()}创建表销毁脚本
* 
*/
公共类SqlTableCreator{
私有最终注释配置休眠配置;
私人最终财产和道具;
公共SqlTableCreator(最终集合实体:实体){
ejb3Configuration.addAnnotatedClass(实体);
}
方言道具=新属性();
dialogprops.put(“hibernate.dialogue”、“org.hibernate.dialogue.sqlserverdialogue”);
hibernateConfiguration=ejb3Configuration.getHibernateConfiguration();
}
/**
*创建SQL脚本以创建所有表。
* 
*@return一个{@link String}表示SQL脚本。
*/
公共字符串createTablesScript(){
最终StringBuilder脚本=新建StringBuilder();
最后一个字符串[]creationScript=hibernateConfiguration.generateSchemaCreationScript(方言)
.getdial(方言道具);
for(最终字符串:creationScript){
script.append(string.append(;\n”);
}
script.append(“\ngo\n\n”);
返回script.toString();
}
/**
*创建SQL脚本以删除所有表。
* 
*@return一个{@link String}表示SQL脚本。
*/
公共字符串dropTablesScript(){
最终StringBuilder脚本=新建StringBuilder();
最后一个字符串[]creationScript=hibernateConfiguration.generateDropSchemaScript(方言)
.getdial(方言道具);
for(最终字符串:creationScript){
script.append(string.append(;\n”);
}
script.append(“\ngo\n\n”);
返回script.toString();
}
}

这里解释了如何使用hibernate SchemaExport类来完成您想要的工作


如果您更喜欢在Spring中配置,那么这将非常有用:

 <!-- CONTAINER-MANAGED JPA Entity manager factory (No need for persistence.xml)-->
    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <!-- Fine Grained JPA properties Create-Drop Records -->
    <property name="jpaProperties">
    <props>
    <prop key="hibernate.hbm2ddl.auto">create</prop>
    </props>
    </property> 
    </bean> 
     <!-- The JPA vendor -->
    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <!-- <property name="database" value="MySQL"/> -->
    <property name="showSql" value="true"/>
    <!--  <property name="generateDdl" value="true"/>  -->
    <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>      
    </bean> 
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="emf" />
     </bean>

创造

您可以使用maven插件来实现这一点

       <plugin>
            <!-- run command "mvn hibernate3:hbm2ddl" to generate DLL -->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>hibernate3-maven-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <hibernatetool>
                    <classpath>
                        <path location="${project.build.directory}/classes" />
                        <path location="${project.basedir}/src/main/resources/META-INF/" />                                               
                    </classpath>   

                    <jpaconfiguration persistenceunit="galleryPersistenceUnit" />                     
                    <hbm2ddl create="true" export="false" destdir="${project.basedir}/target" drop="true" outputfilename="mysql.sql" format="true" console="true"/>
                </hibernatetool>
            </configuration>
        </plugin>

org.codehaus.mojo
hibernate3 maven插件
3

在persistence.xml的properties标记下添加上述代码。
“更新”将在您第一次运行代码时创建表,之后,仅在域对象发生任何更改时更新表结构。

由于Hibernate 4.3+现在实现JPA 2.1,生成DDL脚本的适当方法是使用以下JPA 2.1属性集:

<property name="javax.persistence.schema-generation.scripts.action" value="create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="target/jpa/sql/create-schema.sql"/>
正如你所看到的,这很简单

您现在可以在AntTask或MAVEN构建中使用它(对于MAVEN):


maven antrun插件
1.7
生成ddl创建
进程类
跑

使用EclipseLink,您应该添加属性:

<property name="eclipselink.ddl-generation" value="create-tables"/>

正如这里所说:

My persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="appDB" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>LocalMySQL</jta-data-source>
        <class>entity.Us</class>
        <class>entity.Btl</class>
        <class>entity.Co</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
LocalMySQL
实体.美国
实体。Btl
实体公司

Check out他询问仅从带注释的类生成模式。我的团队想要做同样的事情。我相信hbm2dll只适用于我的团队不想使用的.hbm.xml映射文件。我认为OP也不会。根据“Manning Java Persistence with Hibernate”的说法,hbm2ddl是可以的:“Hibernate中自动生成SQL DDL的先决条件始终是Hibernate映射元数据定义,可以是XML映射文件,也可以是Java源代码注释。”谢谢。多亏了你,我的问题在谷歌的第一次点击中得到了回答。非常好的解决方案!但是使用可怕的
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>generate-ddl-create</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <!-- ANT Task definition -->
                                <java classname="com.orange.tools.jpa.JpaSchemaExport"
                                    fork="true" failonerror="true">
                                    <arg value="${persistenceUnitName}" />
                                    <arg value="target/jpa/sql/schema-create.sql" />
                                    <!-- reference to the passed-in classpath reference -->
                                    <classpath refid="maven.compile.classpath" />
                                </java>
                            </target>
                        </configuration>

                    </execution>
                </executions>
            </plugin>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="appDB" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>LocalMySQL</jta-data-source>
        <class>entity.Us</class>
        <class>entity.Btl</class>
        <class>entity.Co</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>