首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate:找不到id xx的实体xx,一对一的关系

Hibernate:找不到id xx的实体xx,一对一的关系
EN

Stack Overflow用户
提问于 2022-04-05 17:54:24
回答 1查看 56关注 0票数 0

我第一次尝试使用Hibernate,所以我对语法还不太熟悉。我试图建立一个图书馆系统的模型。引起问题的类是“借阅”和"CopyBook“,如下所示:

代码语言:javascript
复制
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;
    }
}
代码语言:javascript
复制
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,所以当我试图运行对find实体的查询时,它向我展示了它无法找到id为1的CopyBook,即使它实际上存在于数据库中。

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

CopyBook:

借用:

正如我们所看到的,确实有一个id为1的CopyBook

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

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

所以我发现这是一种非常奇怪的情况,因为所有的数据都存在,而CopyBook能够找到其对应的Borrow。但是Borrow找不到它的通讯员CopyBook

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-06 18:59:55

问题解决了。

因为我有多个一对多的关系,而且默认情况下FetchTypeEager。每当我想检索实体时,它都会为所有实体执行左外部连接,直到结束为止。

但是,在这方面的范围内。一本书不必被命令存在于库中,而是执行“连接”,它会丢失条目,从而导致上述问题。

因此,我所做的就是用Orderfetch = Fetchtype.Lazy设置属性optional = truefetch = Fetchtype.Lazy,这样除非有必要,否则它不会执行联接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71756326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档