使用spring jpa和spring test时,数据不会插入到db中

时间:2015-07-08 13:06:18

标签: spring jpa spring-test

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration(classes = SimpleConfiguration.class)
public class CustomerSyncRepositoryTest {

    @Autowired
    CustomerSyncRepository customerSyncRepository;


    @Autowired
    CustomerRepository customerRepository;

    @Autowired
    MemberShipRepository memberShipRepository;

    @Test
    public void collectDataTest() {
        CustomerSync customerSyncOne = new CustomerSync();
        customerSyncOne.setMembershipNumber("1");
        customerSyncRepository.save(customerSyncOne);

        Membership membership = new Membership();
        membership.setName("钻石");
        membership = memberShipRepository.save(membership);

        Customer customerOne = new Customer();
        customerOne.setMembershipNumber("1");
        customerOne.setMembership(membership);
        customerRepository.save(customerOne);

        Customer customerTwo = new Customer();
        customerTwo.setMembershipNumber("2");
        customerTwo.setMembership(membership);
        customerRepository.save(customerTwo);

        customerSyncRepository.collectMissingSyncData();
        assertEquals(2, customerSyncRepository.findAll().size());
    }
}

db中应该有2条记录,但似乎新记录从未插入到DB中。当我通过启动应用程序来测试它时,db中有2条记录。在单元测试中是否有任何配置?这是customerSyncRepository.collectMissingSyncData()所做的。

public interface CustomerSyncRepository  extends JpaRepository<CustomerSync, String> {
    @Modifying
    @Query(nativeQuery = true, value = "insert into customer_sync(membershipNumber,membership, cnName, enName, phoneNum, password, email, firstname, lastname, active, otherType, otherNum ) SELECT " +
            "a.membershipNumber, " +
            "b.name, " +
            "a.cnName, " +
            "a.enName, " +
            "a.phoneNum ," +
            "a.password, " +
            "a.email, " +
            "a.firstname, " +
            "a.lastname, " +
            "a.active, " +
            "a.otherType, " +
            "a.otherNum " +
            "FROM " +
            "customer a " +
            "JOIN membership b ON (a.membership_id = b.id) " +
            "WHERE " +
            "a.membershipNumber NOT IN (select membershipNumber from customer_sync) ")
    void collectMissingSyncData();

    List<CustomerSync> findBySync(boolean isSync);
}

1 个答案:

答案 0 :(得分:2)

问题是您保存的实体存储在第一级缓存中。换句话说,它们还没有出现在数据库中。

要解决此问题,只需将 flush 第一级缓存的状态导入数据库。

一种方法是将EntityManager注入您的测试类......就像这样......

@PersistenceContext
EntityManager entityManager;

...然后在每次调用entityManager.flush()后调用customerRepository.save(..)(或在调用customerSyncRepository.findAll()之前至少调用一次)。

另一个选项只是在存储库本身上调用flush()方法 - 例如,如果您正在使用Spring Data JPA存储库。