如何导出hibernate的模式> 4.3

时间:2014-03-29 16:24:30

标签: java spring hibernate

关于如何使用hibernate以编程方式导出模式的帖子很多(例如[1])。

但是使用Hibernate 4.3时,类org.hibernate.ejb.Ejb3Configuration被删除了,我找不到任何替换它。 如何以编程方式生成hibernate版本> = 4.3的ddl脚本? 由于我使用spring来设置实体管理器,我也不必再使用persitence.xml了,我想保持这种方式。

[1] http://techblog.bozho.net/?p=935

4 个答案:

答案 0 :(得分:1)

似乎类org.hibernate.tool.hbm2ddl.SchemaExport是在Hibernate中处理DDL的类。如果检查Spring日志,则这是用于调用DDL操作的类。

我不知道你如何在自己的

上使用这个课程

答案 1 :(得分:1)

为了扩展@ geoand的答案,我写了一个独立的SchemaGenerator groovy脚本来触发SchemaExport类:

class SchemaGenerator {
static final void main(String[] args) {
    def outputPath = args[0]
    def classesDir = args[1]

    Configuration cfg = new Configuration()
    cfg.setProperty('hibernate.dialect', 'org.hibernate.dialect.PostgreSQLDialect')
    cfg.setProperty('hibernate.hbm2ddl.auto', 'create')

    addClasses(cfg, new File(classesDir), 'my.entity.package.prefix')

    SchemaExport export = new SchemaExport(cfg)
    export.outputFile = new File(outputPath)
    export.delimiter = ';'
    export.format = true

    export.execute(true, false, false, true)
}
// addClasses uses cfg.addAnnotatedClass(Class) where it grabs the Class instance
// with Class.forName(name) with name derived from iterating the file structure
// of the classesDir
}

诀窍是找到类文件:我在编译完成后使用构建系统运行此脚本,并将其传递给生成的类文件。

但是,从中获取类实例并不重要,主要部分是cfg.addAnnotatedClass()调用以使Hibernate知道它们。

答案 2 :(得分:1)

我使用org.reflections扫描类路径,查找使用@Entity注释的类,并将它们添加到配置中。

此外,我补充说   AuditConfiguration.getFor(CFG); 生成审计表。

之后我使用已经提到的SchemaExport导出Schema。

    //set the package to scan
    Reflections reflections = new Reflections("my.packages.dao");

    //find all classes annotated with @Entity        
    Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(Entity.class);

    //create a minimal configuration
    Configuration cfg = new Configuration();
    cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    cfg.setProperty("hibernate.hbm2ddl.auto", "create");

    for(Class<?> c : typesAnnotatedWith){
        cfg.addAnnotatedClass(c);
    }

    //build all the mappings, before calling the AuditConfiguration
    cfg.buildMappings();

    //configure Envers
    AuditConfiguration.getFor(cfg);

    //execute the export
    SchemaExport export = new SchemaExport(cfg);
    export.setOutputFile(fileName);
    export.setDelimiter(";");
    export.setFormat(true);

    export.execute(true, false, false, true);

答案 3 :(得分:0)

this帖子中,我使用基于将SessionFactory转换为Hibernate SessionFactoryImpl并使用sessionfactory内部架构导出对象的解决方案。这不是最好的解决方案,但有效且简单。

修改

网址已修复。