Spring @DataJpaTest引发未知实体异常

时间:2019-01-02 16:56:17

标签: java testing spring-data-jpa

我正在尝试使用Spring @DataJpaTest批注创建存储库测试。即使使用简单的演示项目,我也会收到IllegalArgumentException: Unknown entity。我想念什么吗?

我正在使用Baeldung示例对Spring进行测试。有一个简单的@DataJpaTest,我将其应用于代码。运行测试时,我收到了IllegalArgumentException: Unknown entity异常,找不到该存储库本身。因此,我使用最少的必需类创建了一个演示项目,但仍然出现此错误。

实体类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class DemoEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String name;

  // getter and setter
}

存储库类:

@Repository
public interface DemoRepository extends JpaRepository<DemoEntity, Long> {

    Optional<DemoEntity> findByName(String name);
}

和测试类:

@RunWith(SpringRunner.class)
@DataJpaTest
public class DemoRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private DemoRepository repository;

    @Test
    public void test() {
        DemoEntity demo = new DemoEntity() {{
            setName("Tim");
        }};

        entityManager.persistAndFlush(demo);

        Optional<DemoEntity> result = repository.findByName("Tim");

        assertThat(result.isPresent()).isTrue();
    }
}

此测试导致以下异常:

java.lang.IllegalArgumentException: Unknown entity: com.example.demo.repositories.DemoRepositoryTest$1

at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:804)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785)
at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persist(TestEntityManager.java:93)
at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persistAndFlush(TestEntityManager.java:131)
at com.example.demo.repositories.DemoRepositoryTest.test(DemoRepositoryTest.java:31)

我正在使用Spring Boot Starter 2.1.1和Java 10。

1 个答案:

答案 0 :(得分:2)

问题是由于您创建DemoEntity实例的方式引起的:

DemoEntity demo = new DemoEntity() {{
        setName("Tim");
    }};

不要使用双括号初始化语法,它应该可以正常工作。

您正在以这种方式创建DemoEntity的子类。这也是错误消息结尾处带有$1的内容

有关https://stackoverflow.com/a/27521360/40064为何仍然是个坏主意的更多信息,请参见re-using an entity's ID for other entities of different kinds - sane idea?