【问题标题】:QueryException: A reference class must be providedQueryException:必须提供参考类
【发布时间】:2017-10-29 15:49:57
【问题描述】:

我正在制定一个计划来整理我的无聊。我最近才开始,所以我还没有开始使用 GUI。该程序在视频/书籍上运行良好,但现在我添加了Game,我得到了queryException。有人知道我做错了什么吗?

错误:

原因:异常 [EclipseLink-6029] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException 异常说明:必须提供引用类。

发生错误的行:

public <E> List<E> getAll(Class<E> eClass){return manager.createQuery(manager.getCriteriaBuilder().createQuery(eClass)).getResultList(); }

不同实体类型调用该行的位置

for (Class eClass: Project.getAllItemTypes())
            repos.put(eClass, new Repository(persistenceAdministrator, eClass));

实体类型

public static Class[] getAllItemTypes(){
        return new Class[]{Movie.class, TvShow.class, ComedyShow.class, Book.class, Comicbook.class, Manga.class, Game.class};
    }

GameTask 的 create-sql

CREATE TABLE Game(
    id INT NOT NULL AUTO_INCREMENT,
    stateStr VARCHAR(50) NOT NULL,
    title VARCHAR(100) NOT NULL,
    releaseDate DATE NOT NULL,
    gameId INT NULL,
  PRIMARY KEY (id),
  CONSTRAINT FK_gameId_game
    FOREIGN KEY (gameId)
    REFERENCES Game (id));

CREATE TABLE Task(
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    completed BOOLEAN NOT NULL,
    gameId INT NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT FK_gameId_task
    FOREIGN KEY (gameId)
    REFERENCES Game (id));

游戏类:

@Entity
public class Game extends Item implements Serializable{

  @OneToMany
  private List<Game> children = new ArrayList<>();
  @OneToMany
  private List<Task> tasks = new ArrayList<>();
}

物品类别

@MappedSuperclass
public abstract class Item extends IEntity implements Serializable{

   @Transient
    private State state;
    @Column(nullable=false)
    private String stateStr;
    @Basic(optional = false)
    @Column(name = "releaseDate")
    @Temporal(TemporalType.DATE)
    private Calendar releaseDate;
    @Column(nullable=false)
    private String title;

IEntity 类

@MappedSuperclass
public abstract class IEntity extends Object implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

持久性.xml

【问题讨论】:

    标签: java mysql jpa orm


    【解决方案1】:

    我找到了解决方案here

    问题是这个方法:

    public boolean isCompleted(){
            //return tasks.stream().allMatch((task) -> task.isCompleted());
            for (Task task: tasks) if (!task.isCompleted()) return false;
            return true;
        }
    

    显然 JPA 实体类不适用于 java 8 lambdas。 我用老派 :P 代码替换了该方法,它可以工作。 无论如何,谢谢你帮助我。

    【讨论】:

      【解决方案2】:

      通常定义自联接的方式类似于:

      游戏

      @Entity
      public class Game extends Item implements Serializable{
      
        @ManyToOne
        @JoinColumn(name = "gameId")
        private Game parent;
      
        @OneToMany(mappedBy = "parent")
        private List<Game> children = new ArrayList<>();
      
        @OneToMany(mappedBy = "game")
        private List<Task> tasks = new ArrayList<>();
      }
      

      任务

      @Entity
      public class Task{
      
          @ManyToOne
          @JoinColumn(name = "gameId")
          private Game game;
      }
      

      别忘了@ManyToOne 映射在Task 一侧。

      【讨论】:

      • 是的,我以前见过这种情况,但我发现将 oneToMany 和 ManyToOne 放在同一个班级有点奇怪。不过我会试试这个,让你知道,谢谢你的回答。
      • 我得到一个 ValidationException,因为现场游戏被视为一个非实体。引起:异常 [EclipseLink-7250] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.ValidationException 异常描述:[class domain.Task] 使用非实体 [class domain。 Game] 作为关系属性 [field game] 中的目标实体。
      • 请添加Item类内容。还要仔细检查您是否在 Game 类上使用 javax.persistence.Entity
      • 添加了 Item 和 IEntity 类。这些是从 Game 类中唯一导入的绝对正确的实体: - import java.io.Serializable; - 导入 java.util.*; - 导入 javax.persistence.*;
      • 看起来不错..你可以添加persistence.xml内容
      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2021-01-14
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多