2

在我的项目中,我经常将 JPA/Hibernate 堆栈用于数据库。

定义persistence.xml时,您可以设置几个选项hibernate.hbm2ddl.auto。如果设置为create表,将在每次应用程序运行时重新创建(持久数据当然会丢失)。也可以通过设置 db fixture 来导入初始数据hibernate.hbm2ddl.import_files。当设置为update只为新实体创建表时(将保留现有表中的持久数据)。

问题是这在开发时不是那么方便,我想要这样的行为:

  • 在第一次应用程序运行时(当数据库中没有表时) - 行为hibernate.hbm2ddl.auto设置为create(基于实体创建表)并导入预定义的数据库夹具
  • 在所有后续运行中 - 行为hibernate.hbm2ddl.auto设置为update(为新实体创建新表,为旧实体保留表/数据)。

这有可能实现这样的事情吗?

有关我的典型堆栈的更多信息:Spring Web 应用程序,在 Tomacat 上运行,数据库是 MySql,JPA/Hibernate 用于数据库访问。

我的典型persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
            <property name="hibernate.hbm2ddl.import_files" value="/META-INF/spring/import.sql"/>
        </properties>
    </persistence-unit>
</persistence>

如果您需要有关我的应用程序配置/结构的其他信息,请发表评论。

4

3 回答 3

3

请记住,使用hbm2ddl.auto您只能更新数据库的结构,而不是它的值。

例如:假设你有

@Version
private Long version;

一段时间后你发现你宁愿拥有

@Version
@Temporal(TemporalType.TIMESTAMP)
private Date lastModified;

Hibernate 没有太多关于语义变化的线索,并且肯定不知道如何相应地转换字段或设置哪个默认值。

属性hbm2ddl.autohbm2ddl.import_files方便用于短期(内存)数据库(因此用于自动化集成或验收测试),但根本不适合生产环境。

强烈建议 使用 scriptellaliquibase 之类的东西。我个人使用后者。Nathan 在该工具上做得很好,尽管它的文档缺乏一些细节。

话虽如此:

-Dhibernate.hbm2ddl.auto=create -Dhibernate.hbm2ddl.import_files=foo.sql

在您的应用程序的第一次启动时应该可以解决问题。只需hbm2ddl.autoupdate您的persistence.xml.

于 2014-03-22T00:47:22.620 回答
1

只需使用update-- 如果数据库为空,则updateand的结果create是相同的。

于 2013-10-24T08:31:44.357 回答
1

我有同样的问题,我没有找到任何 Hibernate/JPA 解决方案。您是否可以选择任何没有 Hibernate 的解决方案?我可以建议使用liquibase。您可以定义一些初始 sql,然后 liquibase 将在启动时执行它们。它有一个 maven 插件,所以你可以在你的 pom 中配置它,然后在 maven 中使用它。

于 2013-10-24T11:00:41.423 回答