我有一个项目,我们依赖hibernate来更新数据库(hibernate.hbm2ddl.auto = update)...即使在prod ... 我正在迁移它以改为使用liquibase。
我唯一担心的是并非每个人都是我团队中的sql guru,所以我正在寻找一种简单的方法来生成hibernate在更新数据库时会做的sql脚本。
我们都在使用Intellij IDEA,但找不到此功能。
你知道任何能够做到这一点的工具吗?
谢谢
答案 0 :(得分:12)
要从映射中实际显示Hibernate生成的脚本,您可以:
按照Andrei I的建议,将这两行添加到您的application.properties:
spring.jpa.hibernate.ddl-auto=validate
logging.level.org.hibernate.tool.hbm2ddl=DEBUG
Hibernate 4.3的来源:SchemaUpdate.java
或使用以下代码手动生成这些脚本:
LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
sessionFactory.scanPackages("your.package.containing.entities");
Dialect dialect = new MySQL5Dialect(); // select your dialect
DatabaseMetadata metadata = new DatabaseMetadata(dataSource.getConnection(), dialect, sessionFactory);
List<SchemaUpdateScript> scripts = sessionFactory.generateSchemaUpdateScriptList(dialect, metadata);
Formatter formatter = FormatStyle.DDL.getFormatter();
for (SchemaUpdateScript script : scripts) {
System.err.println(formatter.format(script.getScript()) + ";");
}
您甚至可以在@Test中添加此代码,如here所述。
祝你好运!答案 1 :(得分:2)
好吧,我不知道一个非常简单的解决方案,但可能以下内容对您有所帮助:
在本地计算机上的使您的日志记录库能够显示DDL查询。例如,看看here for an example和here for hibernate log categories。
将所有更改保存到本地数据库(使用hibernate.hbm2ddl.auto=update
)后,您将需要输出。关于生产使用hibernate.hbm2ddl.auto=validate
。
最终,您可能会考虑在特殊的服务器实例上执行此操作,并将所有DDL日志记录数据保存在特殊文件中。
您还可以检查hibernate是否在hibernate.hbm2ddl.auto=validate
时放置更新查询。
答案 2 :(得分:2)
请查看以下文章:
Schema generation script from Hibernate
它有点旧,但调整了一下应该可以做到这一点:
答案 3 :(得分:2)
使用mvn hibernate4:export
和pom.xml
转储的完整架构:
<!-- To export full DDL schema as it seeing by Hibernate run: mvn hibernate4:export -->
<plugin>
<!-- http://mydevnotes.nicus.it/2013/03/generate-ddl-with-maven-jpa-hibernate-4.html -->
<groupId>de.juplo</groupId>
<artifactId>hibernate4-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<hibernateDialect>org.hibernate.dialect.MySQLDialect</hibernateDialect>
<delimiter>;</delimiter>
<target>SCRIPT</target>
<outputFile>${project.build.directory}/schema-hibernate4-maven-plugin.sql</outputFile>
</configuration>
</plugin>
您可以复制必要的部分。
使用LiquiBase,您可以通过mvn liquibase:diff
和pom.xml
中的相应部分在DB和Hibernate映射文件/注释之间生成差异来获得更多选项:
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.version}</version>
<configuration>
<changeLogFile>${basedir}/src/main/resources/sql/master.xml</changeLogFile>
<propertyFile>${liquibase.profile}</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<logging>debug</logging>
<outputFileEncoding>utf-8</outputFileEncoding>
<driver>com.mysql.jdbc.Driver</driver>
<!-- <url>jdbc:mysql://localhost:3306/app?autoReconnect=true&characterEncoding=utf-8</url> -->
<!-- <username>AAAAAA</username> -->
<!-- <password>BBBBBB</password> -->
<defaultSchemaName>testx</defaultSchemaName>
<changelogSchemaName>testx</changelogSchemaName>
<!-- For mvn liquibase:updateSQL -->
<migrationSqlOutputFile>migration.sql</migrationSqlOutputFile>
<referenceUrl>hibernate:spring:com.app.domain?dialect=org.hibernate.dialect.MySQLDialect</referenceUrl>
<diffChangeLogFile>changelogDiff.xml</diffChangeLogFile>
<diffTypes>tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints</diffTypes>
</configuration>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data.version}</version>
</dependency>
<!-- https://github.com/liquibase/liquibase-hibernate/wiki -->
<dependency>
<groupId>org.liquibase.ext</groupId>
<artifactId>liquibase-hibernate4.2</artifactId>
<version>3.5</version>
</dependency>
</dependencies>
</plugin>
的说明