Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EclipseLink JPA使用非实体作为关系属性中的目标实体_Java_Jpa_Jakarta Ee_Junit_Eclipselink - Fatal编程技术网

Java EclipseLink JPA使用非实体作为关系属性中的目标实体

Java EclipseLink JPA使用非实体作为关系属性中的目标实体,java,jpa,jakarta-ee,junit,eclipselink,Java,Jpa,Jakarta Ee,Junit,Eclipselink,在JUnit(版本4.12)中运行测试以下订单时,我遇到以下错误: Local Exception Stack: Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException Exception Description: An exception w

在JUnit(版本4.12)中运行测试以下订单时,我遇到以下错误:

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: sun.misc.Launcher$AppClassLoader@2c7b84de
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..
}
@实体
公共类产品{
@表格生成器(
name=“ProductGenerator”,
allocationSize=1,
初始值=1)
@身份证
@GeneratedValue(策略=GenerationType.TABLE,
生成器=“产品生成器”)
私人长id;
@列(name=“name”)
私有字符串名称;
@列(name=“Price”)
私人双价;
@列(name=“code”)
私有字符串码;
@奥内托内
@JoinColumn(name=“categoryId”)
私人类别;
@OneToMany(mappedBy=“product”,targetEntity=nl.cimsolutions.snel\u transport.models.OrderLine.class)
私有列表命令行;
公共产品(){
}
公共产品(长Id、字符串名称、字符串代码、双倍价格、类别){
超级();
id=id;
名称=名称;
价格=价格;
代码=代码;
类别=类别;
}
//更多代码。。
}
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>

org.eclipse.persistence.jpa.PersistenceProvider
nl.cimsolutions.snel_transport.models.Orders
nl.cimsolutions.snel_transport.models.OrderLine
nl.cimsolutions.snel_transport.models.OrderList
nl.cimsolutions.snel_transport.models.Customer
nl.cimsolutions.snel_transport.models.Product
nl.cimsolutions.snel_transport.models.Category
nl.cimsolutions.snel_transport.models.Status
nl.cimsolutions.snel_transport.models.Truck
nl.cimsolutions.snel_transport.models.Route
org.eclipse.persistence.jpa.PersistenceProvider
nl.cimsolutions.snel_transport.models.Orders
nl.cimsolutions.snel_transport.models.OrderLine
nl.cimsolutions.snel_transport.models.OrderList
nl.cimsolutions.snel_transport.models.Customer
nl.cimsolutions.snel_transport.models.Product
nl.cimsolutions.snel_transport.models.Category
nl.cimsolutions.snel_transport.models.Status
nl.cimsolutions.snel_transport.models.Truck
nl.cimsolutions.snel_transport.models.Route
如您所见,我已经通过使用中的
@Entity
注释将
产品
订单行
清楚地标记为实体
Product.java
和在
OrderLine.java
中。我还在
persistence.xml
文件中列出了这两个类

我可以在
Product.java
中删除
mappedBy
,这可以解决问题,但我不想这样做,因为我不想创建额外的表

我已经检查了这些解决方案:


但我找不到解决我问题的办法。有人知道我如何解决这个问题吗?

如果它在某个地方有效,但在另一个地方无效,则可能是类路径问题


在JUnit中运行时,请检查类路径,确保没有拾取其他非实体产品类文件,或者检查可能缺少产品的其他persistence.xml。还将EclipseLink logging设置为finest,因为它将在为持久化单元部署时显示每个类

如果它在一个位置工作,而不是另一个位置,则可能是类路径问题

在JUnit中运行时,请检查类路径,确保没有拾取其他非实体产品类文件,或者检查可能缺少产品的其他persistence.xml。还将EclipseLink logging设置为finest,因为它将在为持久化单元部署每个类时显示错误

[class nl.cimsolutions.snel_transport.models.OrderLine]使用非实体[class nl.cimsolutions.snel_transport.models.Product]作为关系属性[field Product]中的目标实体

表示OrderLine中的product字段引用的产品不属于persistenceContext的一部分。通常发生这种情况的原因是未对产品调用EntityManager.persist(),并且没有自动将其持久化的Cascade.persist

很难想象这可能是一个类路径问题,但我看到了一些奇怪的事情。我认为您应该首先检查OrderLine.Product中与产品存储相关的持久化逻辑

错误

[class nl.cimsolutions.snel_transport.models.OrderLine]使用非实体[class nl.cimsolutions.snel_transport.models.Product]作为关系属性[field Product]中的目标实体

表示OrderLine中的product字段引用的产品不属于persistenceContext的一部分。通常发生这种情况的原因是未对产品调用EntityManager.persist(),并且没有自动将其持久化的Cascade.persist


很难想象这可能是一个类路径问题,但我看到了一些奇怪的事情。我认为您应该首先检查OrderLine.Product中与产品存储相关的持久化逻辑

如果它在某个位置工作,但在另一个位置不工作,则很可能是类路径问题。在JUnit中运行时,请检查类路径,确保没有拾取其他非实体产品类文件,或者检查可能缺少产品的其他persistence.xml。还将EclipseLink logging设置为finest,因为它将在为持久性单元部署类时显示每个类。@Chris谢谢,我确实有另一个persistence.xml文件。。如果你愿意,你可以把你的评论作为一个答案,这样我就可以接受它