2017-01-07 56 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> 

正如你可以看到我已經分享早期標記爲ProductOrderLine作爲使用@Entity註釋 Product.javaOrderLine.java的實體。我還列出了persistence.xml文件中的兩個類。

我可以在Product.java中刪除mappedBy修復問題,但我不想這樣做,因爲我不想創建額外的表。

我已經檢查了這些解決方案:

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中運行時檢查您的類路徑,您沒有收到其他非實體Product類文件,或者可能丟失了某個產品的其他persistence.xml文件。同時將EclipseLink日誌記錄設置爲最好,因爲它將顯示每個類,因爲它將其部署到持久性單元。 – Chris

+0

@Chris謝謝我確實有另一個persistence.xml文件..如果你想要你可以發表你的評論作爲答案,所以我可以接受它作爲我的情況的解決方案。 – superkytoz

回答

2

如果它工作一個點,而不是另一個,它可能是一個類路徑的問題。

在JUnit中運行時檢查您的類路徑,您沒有拾取其他非實體Product類文件,或者可能丟失了某個產品的其他persistence.xml。還設置的EclipseLink記錄到最好的,因爲它會顯示每個類,因爲它部署它持久化單元

0

誤差

[類nl.cimsolutions.snel_transport.models.OrderLine]使用非實體[class nl.cimsolutions.snel_transport.models.Product]作爲關係屬性[字段產品]中的目標實體。

意味着OrderLine中的產品字段指的是不屬於persistenceContext的產品。通常發生這種情況的原因是EntityManager.persist()未在Product上調用,並且沒有Cascade.Persist自動保留它。

這有點難以想象,這可能是一個類路徑問題,但我看到了陌生的東西。我認爲您應該先檢查OrderLine.product中與產品商店相關的持久性邏輯。

相關問題