2017-01-07 4 views
0

Я получаю следующее сообщение об ошибке, когда я бег моего теста в JUnit (версия 4.12), чтобы сделать заказ:EclipseLink JPA использует не объект в качестве целевого объекта в отношениях атрибута

Local Exception Stack: 
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: [email protected] 
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [snel-transport-test] failed. 
Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: [class nl.cimsolutions.snel_transport.models.OrderLine] uses a non-entity [class nl.cimsolutions.snel_transport.models.Product] as target entity in the relationship attribute [field product]. 
    at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:127) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:177) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at nl.cimsolutions.snel_transport.services.AbstractFacade.getEntityManagerFactory(AbstractFacade.java:31) 
    at nl.cimsolutions.snel_transport.services.AbstractFacade.find(AbstractFacade.java:77) 
    at controller.OrdersControllerTest.testAddOrder(OrdersControllerTest.java:345) 
    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:498) 
    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.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    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:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [snel-transport-test] failed. 

Однако когда я запускаю webapp, он работает, когда я делаю заказ.

Ниже вы можете увидеть код:

OrderLine.java:

@Entity 
public class OrderLine implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @TableGenerator(
      name = "OrderLineGenerator", 
      allocationSize = 1, 
      initialValue = 1) 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, 
     generator="OrderLineGenerator") 
    private Long id; 
    @Column(name = "orderId") 
    private Long orderId; 
    @ManyToOne(targetEntity = nl.cimsolutions.snel_transport.models.Product.class) 
    @JoinColumn(name="productId") 
    private Product product; 
    private int amount; 

    //More code.. 
} 

Product.java:

@Entity 
public class Product { 

    @TableGenerator(
      name = "ProductGenerator", 
      allocationSize = 1, 
      initialValue = 1) 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, 
      generator="ProductGenerator") 
    private Long id; 
    @Column(name="Name") 
    private String Name; 
    @Column(name="Price") 
    private Double Price; 
    @Column(name="code") 
    private String Code; 
    @OneToOne 
    @JoinColumn(name="categoryId") 
    private Category Categories; 

    @OneToMany(mappedBy = "product", targetEntity = nl.cimsolutions.snel_transport.models.OrderLine.class) 
    private List<OrderLine> orderLines; 

    public Product(){ 

    } 

    public Product(Long Id, String name,String code, Double price, Category categories) { 
     super(); 
     id = Id; 
     Name = name; 
     Price = price; 
     Code = code; 
     Categories = categories; 
    } 

    //More code.. 
} 

persistence.xml:

<?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="snel-transport" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>nl.cimsolutions.snel_transport.models.Orders</class> 
     <class>nl.cimsolutions.snel_transport.models.OrderLine</class> 
     <class>nl.cimsolutions.snel_transport.models.OrderList</class> 
     <class>nl.cimsolutions.snel_transport.models.Customer</class> 
     <class>nl.cimsolutions.snel_transport.models.Product</class> 
     <class>nl.cimsolutions.snel_transport.models.Category</class> 
     <class>nl.cimsolutions.snel_transport.models.Status</class> 
     <class>nl.cimsolutions.snel_transport.models.Truck</class> 
     <class>nl.cimsolutions.snel_transport.models.Route</class> 
     <!-- <jta-data-source>java:app/snel-transport</jta-data-source> --> 
     <!-- <exclude-unlisted-classes>false</exclude-unlisted-classes> --> 
     <properties> 
      <property 
       name="javax.persistence.schema-generation.database.action" 
       value="create" /> 
      <property name="eclipselink.cache.shared.default" value="false"/> 
      <property name="eclipselink.canonicalmodel.subpackage" 
       value="dev" /> 
      <property name="javax.persistence.sql-load-script-source" 
       value="META-INF/sql/insert.sql" /> 
      <property name="javax.persistence.schema-generation-target" 
       value="database" /> 
      <property name="javax.persistence.jdbc.driver" 
       value="org.postgresql.Driver" /> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:postgresql://localhost:5432/snel-transport" /> 
      <property name="javax.persistence.jdbc.user" value="transport_user" /> 
      <property name="javax.persistence.jdbc.password" 
       value="admin" /> 

      <property name="javax.persistence.jdbc.show_sql" value="true" /> 
     </properties> 
    </persistence-unit> 
    <persistence-unit name="snel-transport-test" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>nl.cimsolutions.snel_transport.models.Orders</class> 
     <class>nl.cimsolutions.snel_transport.models.OrderLine</class> 
     <class>nl.cimsolutions.snel_transport.models.OrderList</class> 
     <class>nl.cimsolutions.snel_transport.models.Customer</class> 
     <class>nl.cimsolutions.snel_transport.models.Product</class> 
     <class>nl.cimsolutions.snel_transport.models.Category</class> 
     <class>nl.cimsolutions.snel_transport.models.Status</class> 
     <class>nl.cimsolutions.snel_transport.models.Truck</class> 
     <class>nl.cimsolutions.snel_transport.models.Route</class> 
     <properties> 
      <property 
       name="javax.persistence.schema-generation.database.action" 
       value="drop-and-create" /> 
      <property name="eclipselink.canonicalmodel.subpackage" 
       value="test" /> 

      <property name="javax.persistence.sql-load-script-source" 
       value="META-INF/sql/insert.sql" /> 
      <property name="javax.persistence.schema-generation-target" 
       value="database" /> 
      <property name="javax.persistence.jdbc.driver" 
       value="org.postgresql.Driver" /> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:postgresql://localhost:5432/snel-transport-test" /> 
      <property name="javax.persistence.jdbc.user" value="transport_user" /> 
      <property name="javax.persistence.jdbc.password" 
       value="admin" /> 
      <property name="driverClass" value="org.postgresql.Driver" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Как вам может видеть, что у меня уже есть cl раннее обозначение Product и OrderLine в качестве объектов с использованием аннотации @Entity в Product.java и в OrderLine.java. Я также перечислил оба класса в файле persistence.xml.

Я могу удалить mappedBy в Product.java, который исправляет проблему, но я не хочу этого, потому что я не хочу создавать дополнительную таблицу.

Я уже проверил эти решения:

jpa error uses a non-entity [class ch.printsoft.mailhouse.usermgr.entity.Department] as target entity in the relationship attribute

JPA EclipseLink uses a non-entity as target entity in the relationship attribute

EclipseLink - non Entity as target entity in the relationship attribute

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

+1

Если это работает на одном месте, но не на другом, это, скорее всего, проблема с классом. Проверьте свой путь к классу при запуске в JUnit, чтобы у вас не было другого файла класса продукта, отличного от объекта, или другого файла persistence.xml, где может отсутствовать продукт. Также установите журнал EclipseLink на лучший, так как он отобразит каждый класс, когда он разворачивает его для единицы сохранения. – Chris

+0

@Chris Спасибо, что у меня был еще один файл persistence.xml. Если вы хотите, вы можете опубликовать свой комментарий в качестве ответа, чтобы я мог принять его как решение для моего дела. – superkytoz

ответ

2

Если это работает в одном месте, но не в другом, это, скорее всего, проблема класса.

Проверьте свой путь к классу при запуске в JUnit, чтобы у вас не было другого файла класса продукта, отличного от объекта, или другого файла persistence.xml, где может отсутствовать продукт. Также установлено EclipseLink протоколирование к тонкому, как она покажет каждый класс, как он разворачивает его для единицы сохранения

0

Погрешность

[класс nl.cimsolutions.snel_transport.models.OrderLine] использует не объект [класс nl.cimsolutions.snel_transport.models.Product] как целевой объект в атрибуте отношения [полевой продукт].

Означает, что поле товара в OrderLine относится к Продукту, который не является частью persistenceContext. Обычно это происходит потому, что EntityManager.persist() не вызывался в Product, и не было Cascade.Persist, который автоматически сохраняет его.

Чуть трудно представить, что это может быть проблемой класса, но я видел более странные вещи. Я думаю, вы должны начать с проверки логики persist, связанной с магазином продукта в OrderLine.product.

 Смежные вопросы

  • Нет связанных вопросов^_^