java - 为 JPA 存储库编写 junit

标签 java hibernate jpa junit spring-orm

您好,我需要为 JPA 存储库编写 junit 测试用例。代码如下。

测试编写如下。我已经在类上添加了@ContextConfiguration。

@Autowired
@Qualifier("repository")
private Repository repository;

@Test
public void testCreate() {
    Object objRequest = getObjForRequest();
    Object obj = repository.create(objRequest);
    assertTrue(obj.getId().equals(objRequest.getId()));
}

private Object getObjForRequest() {
    Object obj = new Object();

    obj.setId(1);

    return obj;
}

我的存储库编写如下。

@Repository("repository")
public class Repository implements RepositoryInterface {

      @PersistenceContext
      private EntityManager entityManager;

      @Transactional(value = "springJpaTransactionManager")
      @Override
      public Object create(Object obj) {
             Object ob = obj;
             entityManager.persist(ob);
             entityManager.flush();
             return ob;
      }
}

当我运行测试用例时,出现以下错误。

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:com.*.*.Object

谁能帮我解决这个问题。

谢谢

最佳答案

从以下位置删除 setId:

private Object getObjForRequest() {
    Object obj = new Object();    
    obj.setId(1);    
    return obj;
}

您不应该设置 id ,因为当对象成为持久化 id DB 时会生成 id 。当您使用 id 调用repository.create(objRequest) 时,spring data 会检查它应该是什么 - 创建新对象或更新存在,并且此检查基于 id!=null;

你应该检查:

   assertNoNull(obj.getId());
   assertTrue(obj.getId().longValue()>0);

只有在更新某些现有实体时,您才能按预期比较该 ID。

关于java - 为 JPA 存储库编写 junit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945114/

相关文章:

java - Spring Data返回空元素的List,但List有很多元素

java - JPA Hibernate - @ManyToOne 未正确获取

java - 如何使用当前上下文 JPA、JSF、Java 集合删除项目集合

spring - 是什么导致了 "No property find found for type"spring数据jpa错误

java - commons-fileupload 和 Liferay 的问题

java - Spring JPA -> 将 ResultSet 映射到不存在的实体

java - Hibernate HQL批量删除不删除连接表值

java - foreach 不适用于表达式类型

java - maven项目中的Classloader.getResources()返回一个空的Enumeration

java - 为什么 FetchType.EAGER 在单元测试中不起作用?