2016-07-01 3 views
0

У меня есть проект Java EE в моем затмении, и я использую спящий режим. Но я не знаю, почему, когда я запускаю тесты Junit, я получил неизвестную ошибку объекта.Неизвестный объект при запуске теста junit

Дело в том, что когда я запускаю его с моего сервера tomcat, вызывающего метод из моего сервлета, все идет хорошо.

java.lang.IllegalArgumentException: Unknown entity: com.calamar.beans.Application 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1149) 
at com.calamar.dao.ApplicationDao.addApplication(ApplicationDao.java:32) 
at com.calamar.services.ApplicationService.addApplication(ApplicationService.java:48) 
at com.calamar.test.TestApplicationService.initializeTest(TestApplicationService.java:31) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Здесь класс: пакет com.calamar.beans ;

import javax.persistence.*; 

@Entity 
@Table(name = "calamar.application") 
public class Application 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "application_seq_gen") 
    @SequenceGenerator(name = "application_seq_gen", sequenceName = "calamar.application_id_seq",initialValue = 1, allocationSize = 1) 
    private int id; 
    [...] 
} 

Код, который называется на ApplicationDao.addApplication (ApplicationDao.java:32) ([...] сохраняются (приложение).):

entityManager = entityManagerFactory.createEntityManager(); 

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

    entityManager.close(); 

И мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="calamar" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>beans.Application</class> 
     <class>beans.Derogation</class> 
     <class>beans.DerogationAutre</class> 
     <class>beans.DerogationFille</class> 
     <class>beans.DerogationLinux</class> 
     <class>beans.DerogationOracle</class> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.id.new_generator_mappings" value="false"/> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
      <property name="hibernate.connection.url" value="..."/> 
      <property name="hibernate.connection.username" value="..."/> 
      <property name="hibernate.connection.password" value="..."/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Надеюсь, вы обнаружите, что не так в моем коде.

Thx

+1

Ваш класс называется 'com.calamar. beans.Application'. Но в вашем persistence.xml у вас есть ' beans.Application'. –

+0

@JB Nizet Thx человек это было так! Но почему это работает, когда я запускаю проект на сервере tomcat? – Antoine

ответ

1

класс элемент persistence.xml отличается от пакета класса Application:

Unknown entity: com.calamar.beans.Application 

но

<class>beans.Application</class> 
+0

Thx! Это было так! Тот же вопрос, почему он работает, когда я запускаю проект на сервере tomcat, но не при запуске теста JUnit из Eclipse? – Antoine

+0

Из официальных документов (http://docs.oracle.com/cd/E16439_01/doc.1013/e13981/cfgdepds005.htm) говорится, что он может найти аннотированные объекты в корне PU. Корнем блока persistence является JAR-файл или каталог, каталог META-INF содержит файл persistence.xml. Предположим, что для Tomcat ваш класс выбран из root из PT, но для модульных тестов нет (из-за разного механизма загрузки классов) –