Fehler beim kompilieren-Abfrage: abstract-schema-Typ 'Person' ist unbekannt
Entwickle ich ein Spiel mit Datenbank-Anbindung, und ich verwende JPA zu bestehen meine Daten. Hier ist mein Spiel Entität :
@Entity
@Table(name = "game")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "game_id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "nbTurns")
private int nbTurns;
@Column(name = "playedOn")
@Temporal(TemporalType.TIMESTAMP)
private Date playedOn;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "game_humans", joinColumns = @JoinColumn(name = "game_id"))
@MapKeyColumn(name = "human_id")
@Column(name = "isDead")
private Map<Human, Boolean> humans;
Und hier ist meine Menschliche Person :
@Entity
@Table(name = "human")
public class Human implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String name;
@OneToOne
private Building building;
Um die Liste all der Menschen, gespeichert in der DB, ich verwende das DAO, das funktioniert sehr gut und wird auch der Bau Einheit :
public class HumanDAO implements DAO<Human> {
//...
public List<Human> getAllHumans() {
TypedQuery<Human> query = em.createQuery("SELECT h FROM human h ORDER BY h.name", Human.class);
return query.getResultList();
}
Das problem ist, wenn ich versuche, das gleiche zu tun, um die Liste aller Spiele mit der JPQL-Abfrage SELECT g FROM game g
, bekomme ich diesen Fehler :
[EL Info]: 2013-11-25 13:40:27.761--ServerSession(1943119327)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2013-11-25 13:40:28.151--ServerSession(1943119327)--file:/Users/amine/Documents/workspace/ZombiesServer/target/classes/_ZombiesServer login successful
[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Problem compiling [SELECT g FROM game g].
[14, 18] The abstract schema type 'game' is unknown.
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1585)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1605)
at com.amine.zombies.DAO.GameDAO.getAllGames(GameDAO.java:80)
at com.amine.zombies.application.Application.main(Application.java:21)
... 6 more
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie
aber Sie haben
game
stattGame
.Den
@Table
annotation wird verwendet für die DB.Wenn Sie müssen, ändern Sie den Namen in Ihrem
JPQL
verwenden Sie die@Entity
Anmerkung:@Entity(name="nameUsedInJPQL") => nameUsedInJPQL is used in your JPQL.
Wenn Sie nichts angeben, in Ihrem
@Entity
, dass die groß-und Kleinschreibung Entity-Klasse-name verwendet wird.In meinem Fall, dass ich vergaß, um es zu registrieren, die in persistence.xml.
persistence.xml
aber dann habe ich es umbenannt und es aufgehört zu arbeiten, bis ich habe es aufpersistence.xml
. Also das ist eine gute Antwort, obwohl es möglicherweise nicht der einzige zu sein.Ich hatte genau die gleiche situation aber mein JPQL Abfrage war richtig!!!! Es fiel in Glassfish 4.1 (build 13) (mit EclipseLink).
Nach einigen googeln und einige code zu kommentieren, fand ich heraus, dass die Ursache der "Die abstract-schema-Typ "MyEntity" ist unbekannt" war einige Verwendung von Java 8 lambda-code, der in der entity-Klasse,.
Es scheint, dass ein feature von Java 8 (noch) nicht unterstützt in der version von EclipseLink, dass kommt mit GF. Mehr info finden Sie unter der bug-report auf, dass.
Hoffe, das hilft.
Den Namen verwendet werden, für die JPQL-Abfragen ist definiert als der einfache name des entity-Klasse -
Game
oderHuman
in Ihrem Fall. Es kann überschrieben werden, indem diename
Attribut des@Entity
annotation.@Table
ist eine physikalische Kartierung annotation und hat keinen Einfluss auf die entity-name in der Abfrage.Funktioniert es mit
human
da der query-string ist nicht case-sensitive.Klasse name sollte dort nicht der name der Tabelle in deiner Abfrage
WÄHLEN Sie g AUS Spiel g
Wir haben das problem durch ein update der org.eclipse.die Persistenz.eclipselink Bibliothek von 2.4.0 auf 2.5.1. Nach dem Update auf 2.6.2 funktioniert es wieder.