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”时它会丢失条目并因此导致上述问题。
因此,我所做的只是将属性Order
和Borrow
设置为optional = true
和fetch = Fetchtype.Lazy
,因此除非必要,否则它不会执行连接
我是第一次尝试使用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”时它会丢失条目并因此导致上述问题。
因此,我所做的只是将属性Order
和Borrow
设置为optional = true
和fetch = Fetchtype.Lazy
,因此除非必要,否则它不会执行连接