第一次使用JPA,感觉就是代码简洁。只要接口继承JpaRepository 就能调用默认的方法。如:
public interface UserRepository extends JpaRepository<User,Integer> {
User findByUsername(String username);
}
于是乎,单元测试下 父类的方法:
/**
* JPA方式獲取用戶列表
* @return
*/
public List<User> getUserList(){
return userRepository.findAll();
}
@Test
public void getUserListByJpaTest(){
List<User> list = userServiceImpl.getUserList();
Assert.assertEquals(6, list.size());
}
OK测试通过,快马加鞭下一个:
/**
* JPA方式獲取單個用戶
* @param id
* @return
*/
public User getUserById(int id){
return userRepository.getOne(id);
}
@Test
public void getUserByIdByJpaTest(){
User user = userServiceImpl.getUserById(1);
Assert.assertEquals("admin", user.getUsername());
}
天有不测风云,竟然爆红了~~,异常:
org.hibernate.LazyInitializationException: could not initialize proxy [com.example.demo.domain.User#1] - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)
at ...
大概的意思就是说,单元在进行数据库访问的时候,针对数据库的访问与操作session已经释放了。
解决:在测试方法上面加@Transactional,即添加事务控制注解,保证了该操作过程是一个会话过程
感谢:https://blog.youkuaiyun.com/zlt995768025/article/details/79603479