使用 jar 文件中的实体时出现 JUnit 错误 "Unknown entity type"

JUnit error "Unknown entity type" when using entities from a jar-file

我的 Java 项目出现错误。

运行 我在本地项目中的代码与 GitHub 没有任何连接,一切正常。一旦我 运行 在连接到 GitHub 的项目中对相同代码的 Junit4 测试,就会出现此错误:

Java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager:

Exception Description: Error compiling the query SELECT entity FROM DoSomething entity. Unknown entity type DoSomething.

我正在使用 Eclipse、EclipseLink、PostgreSQL 和 JPA。数据库在我的本地主机上。 运行在 Git 项目中查找 localhost 会不会有任何问题?我有一个 Git 项目的本地存储库,所以我无法想象这真的是个问题。

这是persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
    <persistence-unit name="myDatabase" transaction-type="RESOURCE_LOCAL">

    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
        <property name="javax.persistence.jdbc.url"
            value="jdbc:postgresql://localhost:5432/myDatabase" />
        <property name="javax.persistence.jdbc.user" value="postgres" />
        <property name="javax.persistence.jdbc.password" value="secret" />
        <property name="eclipselink.ddl-generation.output-mode"
            value="database" />
        <shared-cache-mode>NONE</shared-cache-mode>
        
        <property name="eclipselink.logging.level" value="off"/> 

        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 

    </properties>

</persistence-unit>

*编辑: 这是我的实体 class。

import javax.persistence.*;

@Entity
@NamedQueries({
    @NamedQuery(name = "findByName", query = "SELECT r FROM DoSomething r WHERE r.name = :name"),
    @NamedQuery(name = "findByPreis", query = "SELECT r FROM DoSomething r WHERE r.preis = :preis"),
})
public class DoSomething {

@Id
@GeneratedValue
private int id;
private String name;
private double preis;

public DoSomething() {

}

public DoSomething(String name, double preis) {
    this.name = name;
    this.preis = preis;
}

public DoSomething(String name){
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public double getPreis() {
    return preis;
}

public void setPreis(double preis) {
    this.preis = preis;
}}

我将实体 class 导出到一个 jar 文件中。然后我打开了一个引用 jar 文件的新项目。在这个项目中,有一个 class 将实体持久保存到数据库中。由于性能要求,我必须将实体和持久化 class 分成两个项目。

这就是坚持class:

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

import demo.persistence.jpa.JpaUtil;


public class DoSomethingDAO {


public void save(DoSomethingDAO entity) throws Exception {
    EntityManager em = JpaUtil.createEntityManager();

    try {
        em.getTransaction().begin();
        em.persist(entity);
        em.getTransaction().commit();
    } catch (Exception e) {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        throw e;

    } finally {
        em.close();
    }
}


public List<DoSomethingDAO> findByName(String name) throws Exception {
    EntityManager em = Persistence.createEntityManagerFactory("myDatabase").createEntityManager();

    List<DoSomethingDAO> bList = new ArrayList<DoSomethingDAO>();
    
    try {
        

TypedQuery<DoSomethingDAO> tQuery = em.createNamedQuery("findByName", DoSomethingDAO.class);
            tQuery.setParameter("name", name);
            
            bList = tQuery.getResultList();

            em.close();
        } catch (Exception e) {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            e.printStackTrace();
        }
        return bList;
    }
}

看起来您的 persistence.xml 不在类路径中,而 运行 在测试中。测试范围有另一个类路径,然后是主类路径。但是我不知道如何在eclipse中设置它。

我加了

<exclude-unlisted-classes>true</exclude-unlisted-classes>
<class>packagename.DoSomehting</class>

所有 类 到 xml- 文件。现在工作正常。