【问题标题】:Error on compiling query: The abstract schema type 'entity' is unknown编译查询时出错:抽象模式类型“实体”未知
【发布时间】:2013-12-10 05:01:11
【问题描述】:

我正在开发一个带有数据库连接的游戏,并且我使用 JPA 来保存我的数据。这是我的游戏实体:

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

这是我的人类实体:

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

为了获取存储在数据库中的所有人员的列表,我使用了这个 DAO,它运行良好并且还获取了 Building 实体:

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

问题是,当我尝试使用 JPQL 查询 SELECT g FROM game g 获取所有游戏列表时,我收到此错误:

[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

【问题讨论】:

    标签: java jpa persistence jpql


    【解决方案1】:

    你应该有

    SELECT g FROM Game g//you have game
    

    但你有game 而不是Game

    @Table 注释用于 DB。

    如果您需要更改JPQL 中的名称,请使用@Entity 注释:@Entity(name="nameUsedInJPQL") =&gt; nameUsedInJPQL is used in your JPQL.

    如果您未在 @Entity 中指定任何内容,则使用区分大小写的实体类名称。

    【讨论】:

    • 这行得通,但我不明白为什么...我添加了@Table(name="game"),所以我在数据库中的表名为game,而不是Game。此外,对于人类来说,它正在与人类一起工作。你能解释一下为什么吗?
    • 通过回复您的问题更改了答案。
    • 另外,请确保您已在 persistence.xml 文件或 Spring 等效文件中注册了该类。
    • 在我的例子中,我错过了java实体类上的@Table注解。
    【解决方案2】:

    就我而言,我忘记在 persistence.xml 中注册它。

    【讨论】:

    • @PauloFreitas,我来到这里是为了寻找这个问题的标题。也许这个答案对其他人有用。就我而言,这就是解决方案。
    • 确实,这与问题没有任何关系,在persistence.xml文件中我只声明了连接数据库的信息:)
    • @PauloFreitas,没有关系吗?我有这种错误“抽象模式类型'实体'未知”,问题是我忘记在persistence.xml中声明表。对我来说,这就是解决方案。我很抱歉用这个解决方案解决了我的错误。
    • 我有工作的 JPA 实体,但没有在 persistence.xml 中定义,但后来我重命名了它,它停止工作,直到我将它添加到 persistence.xml。所以这是一个很好的答案,虽然它可能不是唯一的。
    【解决方案3】:

    我刚刚遇到了同样的情况,但我的 JPQL 查询是正确的!它出现在 Glassfish 4.1(build 13)(使用 EclipseLink)中。

    经过几次谷歌搜索和一些代码注释后,我发现“抽象模式类型 'MyEntity' 未知”的根本原因是内部使用了一些 Java 8 lambda 代码实体类

    GF 附带的 EclipseLink 版本似乎(尚)不支持 Java 8 的任何功能。更多信息,请参阅the bug report on that.

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      用于 JPQL 查询的名称定义为实体类的简单名称 - 在您的情况下为 GameHuman。它可以被@Entity 注释的name 属性覆盖。 @Table 是物理映射注解,不影响查询中的实体名称。

      它确实适用于human,因为查询字符串不区分大小写。

      【讨论】:

        【解决方案5】:

        类名不应该是查询中的表名 从游戏 g 中选择 g

        【讨论】:

          【解决方案6】:

          由于 org.eclipse.persistence.eclipselink 库从 2.4.0 更新到 2.5.1,我们遇到了问题。更新到 2.6.2 后,它又可以工作了。

          【讨论】:

            【解决方案7】:

            如果您在一个包中调用persistence.xml,那么org.eclipse.persistence.jpa 必须在您的包(或多个包)之前启动。如果没有,您将得到相同的异常。您还将看到这些表尚未在您的数据库中创建。因此,始终将 org.eclipse.persistence 添加为清单中的导入包是一个好主意。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-13
              • 1970-01-01
              • 1970-01-01
              • 2019-01-22
              • 1970-01-01
              • 2012-03-21
              • 2011-07-23
              • 2012-06-17
              相关资源
              最近更新 更多