2016-05-08 5 views
0

Ich habe mit einem Fehler in meinem Java-Projekt zu kämpfen.JUnit-Fehler "Unbekannter Entitätstyp" bei Verwendung von Entitäten aus einer JAR-Datei

Wenn ich meinen Code in einem lokalen Projekt ohne Verbindung zu GitHub ausführe, funktioniert alles einwandfrei. Sobald ich die junit4 Test des gleichen Code in einem Projekt mit GitHub laufen, tritt dieser Fehler auf:

Java.lang.IllegalArgumentException: Eine Ausnahme ist aufgetreten, während eine Abfrage in EntityManager erstellen:

Exception Beschreibung : Fehler beim Kompilieren der Abfrage SELECT entity FROM DoSomething entity. Unbekannter Entitätstyp DoSomething.

Ich benutze Eclipse, EclipseLink, PostgreSQL und JPA. Die Datenbank befindet sich auf meinem lokalen Host. Könnte es Probleme geben, localhost beim Ausführen des Git-Projekts zu finden? Ich habe ein lokales Repository für das GitProject, daher kann ich mir nicht vorstellen, dass dies wirklich ein Problem ist.

Dies ist die 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> 

* EDIT: Das ist meine Entitätsklasse.

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; 
}} 

Ich exportierte die Entitätsklasse in eine Jar-Datei. Dann habe ich ein neues Projekt geöffnet, in dem die JAR-Datei referenziert wird. In diesem Projekt gibt es eine Klasse, die die Entität in der Datenbank festhält. Aufgrund einer Leistungsanforderung muss ich die Entity und die persistierende Klasse in zwei Projekte aufteilen.

Die Übersicht zeigt die persistierende Klasse:

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; 
    } 
} 
+0

können Sie Ihre 'DoSomething'-Entitätsklasse veröffentlichen? –

+1

Dies ist die "DoSomething" -Klasse, über die Sie uns noch nichts gesagt haben? und nicht in persistence.xml aufgeführt? GitHub hat absolut nichts mit irgendetwas zu tun ... die Klassen müssen im CLASSPATH sein! –

Antwort

0

wie Ihr persistence.xml Sieht nicht auf dem Classpath, während in Tests ausgeführt werden. Der Testbereich hat einen anderen Klassenpfad als der Hauptklassenbereich. Aber ich weiß nicht, wie ich das in Eclipse einrichten soll.

0

Ich habe

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

für alle Klassen in die XML-Datei. Funktioniert jetzt gut.