当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从JPA带注释的实体类自动生成数据模式》经验,为你挑选了5个好方法。

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

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



1> Vincent Ramd..:

你可以使用Hibernate的hbm2ddl.文档在这里.


他询问仅从注释类中生成模式.我的团队想要做同样的事情.我相信hbm2dll只适用于我的团队不想使用的.hbm.xml映射文件.我认为OP也没有.

2> 小智..:

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

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

如果需要,您可以使用persitence.xml和persitance单元名称.只是说点什么,我也发布了代码.

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> 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();
    }
}



3> hohonuuli..:

作为相关说明:可以在此处找到使用EclipseLink JPA生成数据库模式的文档.



4> Donatello..:

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




由于它将在运行时运行,您可能希望在构建时执行此DDL生成. Hibernate4不再支持官方maven插件,因为Hibernate团队正在转向Gradle.

无论如何,这是以编程方式生成此脚本的JPA 2.1方法:

import java.io.IOException;
import java.util.Properties;

import javax.persistence.Persistence;

import org.hibernate.jpa.AvailableSettings;

public class JpaSchemaExport {

    public static void main(String[] args) throws IOException {
        execute(args[0], args[1]);
        System.exit(0);
    }

    public static void execute(String persistenceUnitName, String destination) {
        System.out.println("Generating DDL create script to : " + destination);

        final Properties persistenceProperties = new Properties();

        // XXX force persistence properties : remove database target
        persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO, "");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none");

        // XXX force persistence properties : define create script target from metadata to destination
        // persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SCHEMAS, "true");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_ACTION, "create");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SOURCE, "metadata");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_CREATE_TARGET, destination);

        Persistence.generateSchema(persistenceUnitName, persistenceProperties);
    }

}

你可以看到它非常简单!

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

            
                maven-antrun-plugin
                1.7
                
                    
                        generate-ddl-create
                        process-classes
                        
                            run
                        
                        
                            
                                
                                
                                    
                                    
                                    
                                    
                                
                            
                        

                    
                
            



5> 小智..:

以下是如何使用hibernate SchemaExport类来完成您想要的操作的解释.

http://jandrewthompson.blogspot.com/2009/10/how-to-generate-ddl-scripts-from.html

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有