首页 > 解决方案 > 使用休眠的 EntityNotFoundException 句柄

问题描述

我正在开发 Spring Boot 应用程序,其中我正在处理三个数据库表。

Worker、Task 和 ObjectDetail

工人实体

@Entity
@Table(name = "WORKER")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@EqualsAndHashCode(of = "id", callSuper = false)
@ToString()
public class Worker{
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(unique = true, length = 36)
    private String id;
    private String name;
}

下一节课任务

@Entity
@Table(name = "TASK")
@Data
@EqualsAndHashCode(of = "id", callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Task{

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(unique = true, length = 36)
    private String id;

    @ManyToOne
    @JoinColumn(name = "School_Id")
    private School assignWorker;

 }

ObjectDetail 实体

@Entity
@Table(name = "OBJECT_DETAIL")
@Data
@EqualsAndHashCode(of = "id", callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ObjectDetail{

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(unique = true, length = 36)
    private String id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "taskId")
    @NotNull
    @NotFound(action=NotFoundAction.IGNORE)
    private Task task;

    @ManyToOne
    @JoinColumn(name = "worker_id")
    private Worker worker;

 }

项目实体

@Entity
@Table(name = "PROJECT")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@EqualsAndHashCode(of = "id", callSuper = false)
public class Project {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(unique = true, length = 36)
    private String id;

    @NotNull(message = "You must specify a name.")
    @Column(unique = true)
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "project")
    @LazyCollection(LazyCollectionOption.TRUE)
    @JsonIgnore
    private List<Task> tasks = new ArrayList<>();

}

设想

正如我所提到的,我有三个数据库表以及它们各自的实体类。并且在特定工作人员上为项目运行的每个任务及其处理的数据都保存在 objectDetail 表中。如上述实体所述,我们将工作人员存储在 objectDetail 和任务表中。当我们在内部创建任务对象时,休眠会自动获取工作者对象,并且对于 ObjectDetail 对象创建工作者和任务对象也是如此。(按 objectdetail 的 task_id 映射到任务对象,其余部分相同)

现在由于一些问题,我们需要从工作表中删除一个工作条目。假设直接我们没有要求运行哪个任务的工人。但是当我们使用休眠列出任务项时,我们得到

javax.persistence.EntityNotFoundException: Unable to find <packagename>.Worker with id 5bb2c8f7-c938-4343-89e2-611b39d99f90

我知道它因为那个 Worker 而抛出的东西在数据库中不存在。我用谷歌搜索并找到了一些解决方案,@NotFound(action=NotFoundAction.EXCEPTION) 但它似乎忽略了所有未找到的此类记录。

我的要求是只忽略工作对象而不是完整记录。我想列出所有具有工作对象 null 或具有值的任务。

如果有人对此有建议,我将不胜感激。

标签: javaspringhibernatehql

解决方案


推荐阅读