在h2数据库中看不到任何数据

时间:2014-04-21 11:22:04

标签: java hibernate h2 squirrel-sql

我进行了一些单元测试,将一些Person数据存储到数据库中。为此,我使用EntityManagerFactory

@Test
public void findPersonById() {
    personDao.savePerson(new Person("Hans"));
    Person person = new Person("Peter");
    personDao.savePerson(person);
    Long id = person.getId();
    flushAndClear();

    person = personDao.findById(id);
    assertThat(person.getName(), is("Peter"));
}

其中

private EntityManager entityManager;

public Person savePerson(Person person) {
    entityManager.persist(person);
    return person;
}

public Person findById(Long id) {
    Person person = entityManager.find(Person.class, id);
    return person;
}

使用此Base-Test-class

import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.Before;

public class AbstractDaoTest {

    protected EntityManager entityManager = Persistence.createEntityManagerFactory("DefaultPersistenceUnit")
        .createEntityManager();

    protected PersonDao personDao = new PersonDao();

    @Before
    public void setUp() {
        personDao.setEntityManager(entityManager);
        entityManager.getTransaction().begin();
    }

    @After
    public void tearDown() {
        entityManager.getTransaction().rollback();
    }

    protected void flushAndClear() {
        entityManager.flush();
        entityManager.clear();
    }
}

我的单元测试运行为绿色,但是当我调试此测试时,我无法在db上看到任何数据(使用squirrel)。调试器当前处于哪个步骤并不重要,表始终为空。我对squirrel使用以下配置:

jdbc:h2:file:~/test;DB_CLOSE_DELAY=-1;LOCK_MODE=0;AUTO_SERVER=TRUE
with Driver: H2

你能帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这是因为您的测试用例设计不当。

首先,如果您希望将数据添加到数据库,则应在任何更新/插入操作之后提交更改。只有在事务期间有任何异常时,才必须进行回滚。

将测试设计成这样的东西。

        @BeforeTest
        public void setUp() {
            personDao.setEntityManager(entityManager);
            entityManager.getTransaction().begin();

        }

        @AfterTest
        public void tearDown() {
            // TODO clear all inserted data either using sql statement or JPA
            //Rollback only if there is any exception
            entityManager.getTransaction().rollback();
        }


        @Test
        public void findPersonById() {
        Long id = System.currentTimeMillis();

            personDao.savePerson(new Person(id,"Hans"));
            entityManager.flush();

           // TODO your assert statements go in here
           /* Data is visible till here during your debug. 
              Once AfterTest is executed then the your data would be rolled back
            */
        }

我已经使用testNG作为我的单元测试工具,请根据您的要求使用合适的工具。 此外,如果您是enityManager.flush(),则插入/更新语句将被发送到DB,但在由HIbernate将提交指令发送到DB之前不会提交。请参阅this答案了解更多详情