关于如何使用hibernate以编程方式导出模式的帖子很多(例如[1])。
但是使用Hibernate 4.3时,类org.hibernate.ejb.Ejb3Configuration
被删除了,我找不到任何替换它。
如何以编程方式生成hibernate版本> = 4.3的ddl脚本?
由于我使用spring来设置实体管理器,我也不必再使用persitence.xml了,我想保持这种方式。
答案 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内部架构导出对象的解决方案。这不是最好的解决方案,但有效且简单。
修改强>
网址已修复。