【问题标题】:Can't see any data in h2 database在 h2 数据库中看不到任何数据
【发布时间】:2014-06-05 10:59:06
【问题描述】:

我得到了一些单元测试,将一些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 类

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)。调试器当前在哪一步无关紧要,表始终为空。我正在为松鼠使用以下配置:

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

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

【问题讨论】:

  • 您是否将数据保存在事务中?
  • 他在person 引用上明确调用persist。他还刷新了交易。
  • 是的,它发生在事务中,我编辑它。
  • 克里斯检查我的答案

标签: java hibernate h2 squirrel-sql


【解决方案1】:

发生这种情况是因为您的测试用例设计不当。

首先,如果您希望将数据添加到数据库中,您应该在任何更新/插入操作之后提交更改。只有在交易过程中出现异常时才需要回滚。

像这样设计你的测试。

        @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(),则插入/更新语句将被发送到数据库,但在 HIbernate 将提交指令发送到数据库之前不会被提交。详情请参考this答案

【讨论】:

  • 我使用的教程说:“如果你使用 squirrel,数据库的配置方式使得更改在提交之前可见。”遗憾的是,我不能给你这个教程的链接,因为它在实习生网络中。有这样的设置吗?
  • 回滚仅用于测试目的。我认为作者这样做是为了在每次执行之前准备好数据库。
  • 如果是这种情况,请使用sql语句清除您插入的内容。如果您进行回滚,则您插入的任何内容都将被删除。顺便说一句,你的测试通过了,因为你已经刷新了插入。
  • 有一点很清楚;如果您回滚,您的更改将不会在数据库中可见!如果您希望插入可见,则必须提交!
  • 我希望它们仅在调试期间可见!
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2020-08-12
  • 2016-02-12
  • 2018-01-21
  • 2021-10-11
相关资源
最近更新 更多