JPA Hibernate - Неизвестный объект в исключенном классе - PullRequest
0 голосов
/ 12 апреля 2019

Когда я запускаю свой тестовый класс UserServiceTest, я получаю эту ошибку.Странно то, что я не пытаюсь сохранить экземпляр типа UserServiceTest.

Код, на котором он не выполняется.Если я закомментирую этот код, остальные тесты будут запущены, и я не получу эту ошибку.

User persistedUser = new User() {
    {
        setUsername("Jan123");
        setName("Jan");
        setText("test bio");
        setLocation("<location>");
        setWebsite("<website>");
    }
};

entityManager.getTransaction().begin();
entityManager.persist(persistedUser);
entityManager.getTransaction().commit();

java.lang.IllegalArgumentException: Неизвестная сущность: UserServiceTest $ 1 в org.hibernate.internal.SessionImpl.firePersist (SessionImpl.java:808) в org.hibernate.internal.SessionImpl.persist (SessionImpl.java:789) в UserServiceTest.setUp (UserServiceTest.java:55) в java.base / jdk.internal.refl.AternIreImpho.Norinvoke0 (нативный метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpljet.hojjind.hodbase / java.lang.reflect.Method.invoke (Method.java:566) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.lable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:24) в org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java:27) в org.junit.runners.ParentRunner.run (ParentRunner.j).: 363) по адресу org.apache.maven.surefire.junit4.JUnit4Provider.execute (JUnit4Provider.java:252) по адресу org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet (JUnit4Provide.java:g:maven.surefire.junit4.JUnit4Provider.invoke (JUnit4Provider.java:112) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.base / jdk.internalIhod.java: 62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:566) илиapache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray (ReflectionUtils.java:189) в org.apache.maven.surefire.booter.ProviderFactory $ ProviderProxy.invoke (ProviderFactory.jav)a: 165) в org.apache.maven.surefire.booter.ProviderFactory.invokeProvider (ProviderFactory.java:85) в org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess (ForkedBooter.java:11apacheg или в.maven.surefire.booter.ForkedBooter.main (ForkedBooter.java:75)

Вот мой файл persistence.xml.Я проверил, что он используется, чтобы умышленно сформировать XML, чтобы увидеть, не вызывает ли он ошибку синтаксического анализа XML, что и происходит.Таблицы создаются просто отлично, как я вижу в выходных данных сборки и в SQL Server Management Studio.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="KwetterPUTest" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>Kweet</class>
    <class>User</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.connection.url" value="jdbc:sqlserver://localhost;databaseName=KwetterTest;" />
      <property name="hibernate.connection.username" value="sa" />
      <property name="hibernate.connection.password" value="admin" />
      <property name="hibernate.show_sql" value="true"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="create"/>
    </properties>
  </persistence-unit>
</persistence>

Редактировать: вот соответствующий код из UserServiceTest.Я сделал поиск использования в NetBeans для любых экземпляров UserServiceTest, которые я, возможно, ошибочно создал.Там нет ни одного.

private static EntityManagerFactory entityManagerFactory;
    private static EntityManager entityManager;
    private static UserService userService;
    private static User persistedUser;

    @BeforeClass
    public static void setUp() {
        entityManagerFactory = Persistence.createEntityManagerFactory("KwetterPUTest");
        entityManager = entityManagerFactory.createEntityManager();
        userService = new UserService(new UserDAOJPAImpl(entityManager));
        persistedUser = new User() {
            {
                setUsername("Jan123");
                setName("Jan");
                setText("test bio");
                setLocation("<location>");
                setWebsite("<website>");
            }
        };

        entityManager.getTransaction().begin();
        entityManager.persist(persistedUser);
        entityManager.getTransaction().commit();
    }

Редактировать 2: файл pom для тех, кто заинтересован.Я использовал последнюю версию 4.x Hibernate, а также последние версии 5.x и 5.2.2.Ничто не изменило ничего.

<dependencies>        
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.2.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>7.2.1.jre8</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <type>jar</type>
    </dependency>
</dependencies>

1 Ответ

1 голос
/ 12 апреля 2019

Почему создаются экземпляры класса User следующим образом:

persistedUser = new User() {
        {
            setUsername("Jan123");
            setName("Jan");
            setText("test bio");
            setLocation("<location>");
            setWebsite("<website>");
        }
    };

Это создаст внутренний класс типа: UserServiceTest$1

И этот класс не распознается Hibernate, поскольку трассировка стека говорит:

java.lang.IllegalArgumentException: неизвестный объект: UserServiceTest $ 1

Вы должны сделать это так:

persistedUser = new User();
persistedUser.setUsername("Jan123");
persistedUser.setName("Jan");
persistedUser.setText("test bio");
persistedUser.setLocation("<location>");
persistedUser.setWebsite("<website>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...