JPA 脚本生成重复语句

Posted

技术标签:

【中文标题】JPA 脚本生成重复语句【英文标题】:JPA script generation duplication statements 【发布时间】:2017-11-16 23:22:44 【问题描述】:

我在一个项目中使用 JPA(休眠实现)和 spring。在运行自动化测试时,persistance.xml 通过 spring 配置为数据库生成创建和删除脚本。

只有一个名为Book 的实体。这应该在 create 脚本中创建一行来创建表 Book,并在 drop 脚本中创建一行来删除表 Book

问题是每次我运行测试时脚本都不会重新生成,而是会在脚本中添加一个新行。因此,如果我运行 3 次测试,脚本如下所示:

create table Book (title varchar(255) not null, primary key (title))
create table Book (title varchar(255) not null, primary key (title))
create table Book (title varchar(255) not null, primary key (title))

这些是持久性配置值

    <!-- C3p0 datasource with connection pool configuration -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="$jdbc.driverClassName" />
    <property name="jdbcUrl" value="$jdbc.url" />
    <property name="user" value="$jdbc.username" />
    <property name="password" value="$jdbc.password" />
    <property name="maxPoolSize" value="20" />
    <property name="minPoolSize" value="5" />
    <property name="maxStatements" value="50" />
</bean>

    <bean id="EntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter" ref="JpaAdapter" />
    <property name="persistenceUnitName" value="com.test.domain.PU" />
    <property name="jpaPropertyMap">
        <map>
            <entry key="javax.persistence.schema-generation.database.action" value="$jpa.database.action:none"/>
            <entry key="javax.persistence.schema-generation.scripts.action" value="$jpa.scripts.action:none"/>
            <entry key="javax.persistence.schema-generation.scripts.drop-target" value="$jpa.scripts.drop-target:target/generated-resources/schemagen/db/drop.ddl"/>
            <entry key="javax.persistence.schema-generation.scripts.create-target" value="$jpa.scripts.create-target:target/generated-resources/schemagen/db/create.ddl"/>
            <!-- If present, a ddl script is loaded to init the db. Used only during development. For production a specific script will be provided. 
                 The script is activated on create, drop-and-create, and create-and-drop options for database schema creation -->                    
            <entry key="javax.persistence.sql-load-script-source" value="$jpa.sql-load-script-source:sql/init_db.ddl"/>
        </map>
    </property>
</bean>

而测试时用到的属性文件是:

jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
jdbc.url=jdbc:hsqldb:mem:testdb
jdbc.username=sa
jdbc.password=

jdbc.showSql=true
jpa.database.action=drop-and-create
jpa.scripts.action=drop-and-create

有人知道导致这种行为的原因吗?

【问题讨论】:

你试过把@Transactional放在main方法上吗? 我在主要方法上使用@Transactional。经过进一步调查,这似乎是休眠版本的问题。 【参考方案1】:

经过进一步调查,该问题似乎与休眠有关。

我使用的是 5.2.10.Final 版本的休眠。但是,当我切换回 4.3.6.Final 版本时,一切正常。

【讨论】:

以上是关于JPA 脚本生成重复语句的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate - JPA 在不同的情况下生成具有相同名称的重复表

springboot JPA 一对多关联查询 ,动态复杂查询 去除重复数据 in语句使用

使用 JPA 和 JUnit 测试时如何一致地擦除内存数据库中的 H2 [重复]

JPA 查询部分字段

cron 运行的 shell 脚本中的 echo 语句 [重复]

如何从脚本中删除多余的插入语句以提高性能[重复]