【问题标题】:database not updated using JPA and spring when new entries are made生成新条目时未使用 JPA 和 spring 更新数据库
【发布时间】:2015-06-15 10:05:06
【问题描述】:

我正在使用 Spring 框架配置一个简单的 JPA 应用程序。 我的目标是在 JUnit 测试运行期间用数据填充数据库。我知道这并不理想。但我想要它用于不同的目的。

这是我的persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="1.0">
    <persistence-unit name="tothought-tutorial-test" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
        <!--    <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop" /> -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

测试上下文.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.2.xsd">

    <!-- Database -->
    <!--  <jdbc:embedded-database id="datasource" type="H2"></jdbc:embedded-database> -->

    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/to_thought_tutorial" />
        <property name="username" value="demo" />
        <property name="password" value="demo" />
    </bean>

    <!-- Entity Manager -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="datasource" />
        <property name="persistenceUnitName" value="tothought-tutorial-test" />
    </bean>

    <!-- Transaction Manager -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- Jpa Repositories -->
    <jpa:repositories base-package="com.cloudfoundry.tothought.repositories"></jpa:repositories>
</beans>

这里是junitTest

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:META-INF/test-context.xml")
@Transactional
public class PostPartRepositoryTest {

    @Autowired
    PostPartRepository repository;

    @Test
    public void test() {
        PostPart postPart = new PostPart();
        String body = "Hello";
        postPart.setBody(body);

        repository.save(postPart);

        PostPart dbPostPart = repository.findOne(postPart.getPostPartId());
        assertNotNull(dbPostPart);
        assertEquals(body, dbPostPart.getBody());
    }

    @Test
    public void insertTest(){

        Post post = new Post();
        post.setPostDate(new Date());
        post.setTitle("First Post");

        PostPart postPart = new PostPart();
        String body = "Hello";
        postPart.setBody(body);

        postPart.setPost(post);

        repository.save(postPart);

        PostPart dbPostPart = repository.findOne(postPart.getPostPartId());
        assertNotNull(dbPostPart);
        assertNotNull(dbPostPart.getPost());
        assertEquals(body, dbPostPart.getBody());
    }

}

两个测试都通过了。但是我没有在表格中看到任何条目,尽管表格是第一次创建的。

【问题讨论】:

    标签: spring hibernate spring-mvc jpa


    【解决方案1】:

    您不会看到任何条目,因为您正在使用@Transactional 使用SpringJUnit4ClassRunner 运行测试。使用@Transactional 运行测试的默认设置是在测试完成后自动回滚任何数据库更改。有关更多信息,请参阅此问题here

    这些事情发生的顺序如下:

    1. 测试开始,安装脚本运行,创建您的表。
    2. 测试开始在事务上下文中运行。
    3. 测试完成运行,并且在测试期间所做的任何数据库更改都会自动回滚,使数据库保持在测试运行之前的状态。

    您可以更改此默认行为,您可以在类的顶部使用@TransactionConfiguration(defaultRollback=false)。然而,这是不好的做法,因为单元测试不应该相互依赖,也不应该永久修改应用程序状态。此外,如果您依赖一个测试在环境中设置某些内容并在下一个测试中使用它,则无法保证测试运行程序执行的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多