2013-11-25 7 views
7

Sto sviluppando un gioco con una connessione al database e utilizzo JPA per mantenere i miei dati. Qui è la mia entità del gioco:Errore nella compilazione della query: il tipo di schema astratto 'entity' è sconosciuto

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

Ed ecco la mia entità umana:

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

per ottenere l'elenco di tutti gli esseri umani memorizzati nel DB, io uso questo DAO, che sta lavorando molto bene e ottiene anche l'entità di costruzione:

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

il problema è quando provo a fare lo stesso per ottenere la lista di tutti i giochi con la query JPQL SELECT g FROM game g, ottengo questo errore:

[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 

Qualcuno può aiutarmi per favore? Grazie in anticipo.

risposta

17

Si dovrebbe avere

SELECT g FROM Game g//you have game 

ma avete game invece di Game.

L'annotazione @Table viene utilizzata per il DB. Se hai bisogno di cambiare il nome nel tuo JPQL, usa l'annotazione @Entity: @Entity (name = "nameUsedInJPQL") => nameUsedInJPQL è usato nel tuo JPQL. Se non si specifica nulla nel proprio @Entity, viene utilizzato il nome classe Entity con distinzione tra maiuscole e minuscole.

+0

Questo è il lavoro, ma io non capisco perché ...Ho aggiunto @Table (name = "game"), quindi la mia tabella nel database è denominata game, non Game. Inoltre, per gli umani, sta lavorando con umani. Puoi spiegare perché, per favore? –

+2

Modificata la risposta con una risposta alla tua domanda. –

+0

OK, grazie per il vostro aiuto –

2

Il nome da utilizzare per le query JPQL è definito come il nome semplice della classe di entità - Game o Human nel tuo caso. Può essere sovrascritto dall'attributo name dell'annotazione @Entity. @Table è un'annotazione di mappatura fisica e non influenza il nome dell'entità nella query.

Funziona con human perché la stringa di query non è sensibile al maiuscolo/minuscolo.

4

Nel mio caso ho dimenticato di registrarlo in persistence.xml.

+1

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. –

+2

@PauloFreitas, sono arrivato qui cercando il titolo di questa domanda. Forse questa risposta può essere utile per qualcun altro. Nel mio caso questa era la soluzione. – meurer

+0

In effetti, questo non ha alcuna relazione con la domanda, nel file persistence.xml ho solo dichiarato le informazioni per connettersi al database :) –

3

Ho appena avuto la stessa situazione ma la mia query JPQL era corretta! Si è verificato in Glassfish 4.1 (build 13) (con EclipseLink).

Dopo alcuni googling e un codice di commento, ho scoperto che la causa principale di "L'abstract tipo di schema 'MyEntity' è sconosciuta" era un certo uso di Java 8 codice lambda all'interno della classe di entità.

Sembra che qualsiasi funzione di Java 8 non sia (ancora) supportata nella versione di EclipseLink fornita con GF. Maggiori informazioni, vedi the bug report on that.

Spero che questo aiuti.

+0

Questo ha funzionato per me. Grazie. –

0

Abbiamo riscontrato il problema a causa di un aggiornamento della libreria org.eclipse.persistence.eclipselink dalla 2.4.0 alla 2.5.1. Dopo l'aggiornamento alla 2.6.2, funziona di nuovo.

1

nome della classe non dovrebbe esserci il nome della tabella nella query SELEZIONA G da gioco g