我目前正在使用JPA/Hibernate处理桌面应用程序,以便在H2数据库中保存数据.如果我出于某种原因需要在将来对数据库模式进行更改,我很好奇我的选择是什么.也许我将不得不引入新实体,删除它们或只是更改实体中的属性类型.
我已经阅读了很多有关LiquiBase,Spring和Hibernate之间集成的帖子,但是没有一个适用于我的情况.
我正在开始一个使用Spring和Hibernate的新项目,因此我正在寻找一种在项目生命周期内管理数据库更改的方法.首先我开始使用hbm2ddl然后意识到人们说这在生产环境中不是一个好主意,所以我得出结论LiquiBase是要走的路(所以我认为).
问题是我没有使用hibernate.xml配置文件(我使用LiquiBase找到的所有示例都使用了hibernate.xml),因为我在我的POJO/DB类中使用java注释并且我的hibernate配置已经完成像这样
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws ClassNotFoundException
{
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
Properties jpaProterties = new Properties();
jpaProterties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
entityManagerFactoryBean.setJpaProperties(jpaProterties);
return entityManagerFactoryBean;
}
Run Code Online (Sandbox Code Playgroud)
我还发现2年前的帖子说这个选项只能在版本2.0(当前版本)中使用,我想知道这是否已经实现.如果是这样,我如何在ANT脚本中使用它?
我需要创建原始数据库DDL和以下数据库更改日志,并将它们导入生产数据库.
编辑:我正在使用:
Liquibase 2.0.5
Liquibase Hibernate 2.0.0
Hibernate 4.1.4
春季3.1.1
Spring Data JPA 1.1.1
我试图使用liquibase-hibernate5(Spring-5.0.4.RELEASE,Hibernate-5.2.15)通过liquibase-maven-plugin在Hibernate实体(来自单个基本包)和干净数据库(Oracle 11gR2 XE)之间生成差异.最后,JPA-2.1.1应用程序通过servlet 3.1与所有(完整)程序配置).我使用JSON作为更改日志格式,liquibase-hibernate5(v3.6)使用liquibase-maven-plugin(v3.5.5).配置中使用的JPA规范版本是2.1.1.来自POM的片段:
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.mvn.plugin.version}</version>
<dependencies>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
</dependency>
<dependency>
<groupId>org.liquibase.ext</groupId>
<artifactId>liquibase-hibernate5</artifactId>
<version>${liquibase.hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>${jpa.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation.api.version}</version>
</dependency>
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>${jdbc.driver.version}</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
</dependencies>
<configuration>
<propertyFile>src/main/resources/jdbc/schema/liquibase.properties</propertyFile>
<propertyFileWillOverride>true</propertyFileWillOverride>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
<executions>
<execution>
<goals>
<goal>diff</goal>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是我目前的liquibase.properties:
url: jdbc:oracle:thin:@localhost:1521/xe
username: db_user
password: password
driver: oracle.jdbc.OracleDriver
referenceUrl: hibernate:spring:org.example.something.entities?dialect=org.hibernate.dialect.Oracle10gDialect …Run Code Online (Sandbox Code Playgroud)