Hibernate:未找到 ID 为 xx 的实体 xx,一对一关系

Hibernate: Entity xx with id xx not found, one to one relationship

我是第一次尝试使用Hibernate,所以我对语法还不是很熟悉。我正在尝试为图书馆系统建模。导致问题的 classes 是“Borrow”和“CopyBook”,如下所示:

import javax.persistence.*;

@Entity
@Table(name = "copybook", schema="project")
public class CopyBook {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="copy_id", unique = true, nullable = false)
    private int copyId;

    @Convert(converter = StatusAttributeConverter.class)
    @Column(name="status", columnDefinition = "TEXT DEFAULT 'AVAILABLE'")
    private Status status;


    @ManyToOne(optional = false)
    @JoinColumn(name = "book_id")
    private Book book;

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    @OneToOne(mappedBy = "copy")
    private Borrow borrow;

    public Borrow getBorrow() {
        return borrow;
    }

    public void setBorrow(Borrow borrow) {
        this.borrow = borrow;
    }

    @OneToOne(mappedBy = "copy", optional = false)
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "borrow", schema = "project")
public class Borrow {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="no_borrow", unique = true, nullable = false)
    private int noBorrow;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date_borrow", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable = false, updatable = false, nullable = false)
    private Date dateBorrow;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date_return")
    private Date dateReturn;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="max_date_return", insertable = false, updatable = false)
    private Date maxDateReturn;

    @OneToOne(optional = false)
    @JoinColumn(name = "copy_id")
    @NotFound(action = NotFoundAction.IGNORE)
    private CopyBook copy;

    public CopyBook getCopy() {
        return copy;
    }

    public void setCopy(CopyBook copy) {
        this.copy = copy;
    }

    @ManyToOne(optional = false)
    @JoinColumn(name="mem_id")
    private Members member;

    public Members getMember() {
        return member;
    }

    public void setMember(Members member) {
        this.member = member;
    }
}

我正在使用 IntelliJ,所以当我尝试 运行 Borrow 实体的查询时,它告诉我它找不到 ID 为 1 的 CopyBook,即使它实际上存在于数据库中

这是我数据库中当前存在的条目(在这两个 table 中)

字帖:

借:

可以看到确实有一个id为1的CopyBook,这也证明了我运行查询CopyBook实体成功返回所有结果

在 JPA 运行ning 之后的结果 select entity from CopyBook entity

为了查看 Borrow 实际给出的结果,我添加了 @NotFound(action = NotFoundAction.IGNORE)。这就是我得到的结果

所以我发现这是一个非常奇怪的情况,因为所有数据都存在,并且CopyBook能够找到它的对应者Borrow。但是 Borrow 无法找到它的对应者 CopyBook ?

Strangley,我有另一个实体 class Order,它具有几乎相同的属性(也与 CopyBook 具有 OneToOne 关系),并且工作完美。

问题已解决。

因为我有多个One-To-Many关系,而FetchType默认是Eager。每当我要检索实体时,它将对所有实体执行 Left Outer Join 直到结束。

但是,在这个上下文的范围内。一本书不必订购就可以存在于图书馆中,执行“JOIN”时它会丢失条目并因此导致上述问题。

因此,我所做的只是将属性OrderBorrow 设置为optional = truefetch = Fetchtype.Lazy,因此除非必要,否则它不会执行连接