我第一次尝试使用Hibernate,所以我对语法还不太熟悉。我试图建立一个图书馆系统的模型。引起问题的类是“借阅”和"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,所以当我试图运行对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关系),并且工作非常完美。
发布于 2022-04-06 18:59:55
问题解决了。
因为我有多个一对多的关系,而且默认情况下FetchType是Eager。每当我想检索实体时,它都会为所有实体执行左外部连接,直到结束为止。
但是,在这方面的范围内。一本书不必被命令存在于库中,而是执行“连接”,它会丢失条目,从而导致上述问题。
因此,我所做的就是用Order和fetch = Fetchtype.Lazy设置属性optional = true和fetch = Fetchtype.Lazy,这样除非有必要,否则它不会执行联接。
https://stackoverflow.com/questions/71756326
复制相似问题