Erreur sur la compilation de la requête: Le schéma abstrait de type 'entity' est inconnu
Je suis en train de développer un jeu avec une connexion de base de données, et j'utilise JPA pour enregistrer mes données. Ici, c'est mon Jeu de l'entité :
@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;
Et voici mon entité Humaine :
@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;
Pour obtenir la liste de tous les humains stockées dans la base de données, j'utilise ce DAO, qui fonctionne très bien et obtient également le Bâtiment de l'entité :
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();
}
Le problème, c'est quand j'essaie de faire la même chose pour obtenir la liste de tous les jeux avec la requête JPQL SELECT g FROM game g
, j'obtiens cette erreur :
[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
OriginalL'auteur Mohamed Amine | 2013-11-25
Vous devez vous connecter pour publier un commentaire.
Vous devriez avoir
mais vous avez
game
au lieu deGame
.La
@Table
annotation est utilisée pour la DB.Si vous avez besoin de changer le nom de votre
JPQL
, utilisez le@Entity
annotation:@Entity(name="nameUsedInJPQL") => nameUsedInJPQL is used in your JPQL.
Si vous ne spécifiez rien dans votre
@Entity
, que la casse de l'Entité nom de la classe est utilisé.Modifié la réponse avec la réponse à votre question.
OK, merci pour votre aide
OriginalL'auteur Andrei I
Dans mon cas, j'ai oublié de l'enregistrer dans le persistence.xml.
Je suis venu ici à la recherche pour le titre de cette question. Peut-être que cette réponse peut être utile pour quelqu'un d'autre. Dans mon cas, cela a été la solution.
En effet, cela n'a aucun rapport avec la question, dans l'persistence.xml fichier je ne l'ai déclaré les informations de connexion à la base de données 🙂
n'ont pas de rapport? J'ai eu ce genre d'erreur "Le schéma abstrait de type 'entity' est inconnu", et le problème c'est que j'avais oublié de déclarer le tableau dans persistence.xml. Pour moi, c'était la solution.Je suis désolé pour réparer mon erreur avec cette solution.
J'ai eu de travail JPA entité sans qu'il soit défini dans
persistence.xml
mais ensuite je l'ai renommé et il a cessé de travailler jusqu'à ce que je l'ai ajouté àpersistence.xml
. C'est donc une bonne réponse, alors il ne peut pas être le seul.OriginalL'auteur leomeurer
J'ai juste eu la même situation, mais ma requête JPQL était correct ! Elle s'est produite dans Glassfish 4.1 (version 13) (avec EclipseLink).
Après quelques recherches sur google et un peu de code pour des commentaires, j'ai découvert que la cause de racine de "Le schéma abstrait de type 'MyEntity" est inconnue" a été certains cas l'utilisation de Java 8 lambda code à l'intérieur de la classe d'entité.
Il semble que de toute fonction de Java 8 n'est pas (encore) pris en charge dans la version de EclipseLink qui vient avec le GF. Plus d'infos, voir le rapport de bug.
Espère que cette aide.
OriginalL'auteur user1853859
Le nom à utiliser pour les requêtes JPQL est défini comme le simple nom de la classe d'entité -
Game
ouHuman
dans votre cas. Elle peut être remplacée par laname
attribut de la@Entity
annotation.@Table
est une cartographie physique annotation et n'influence pas le nom de l'entité dans la requête.Il fonctionne avec
human
parce que la chaîne de requête n'est pas sensible à la casse.OriginalL'auteur kostja
nom de classe doit être il n'y a pas le nom de la table dans votre requête
SÉLECTIONNEZ g DE Jeu g
OriginalL'auteur Manish Kr
Nous avons eu le problème dû à une mise à jour de org.eclipse.la persistance.eclipselink bibliothèque de 2.4.0 pour 2.5.1. Après la mise à jour de 2.6.2 il fonctionne à nouveau.
OriginalL'auteur tareq