Java 冬眠-@OneToOne关系

Java 冬眠-@OneToOne关系,java,hibernate,one-to-one,Java,Hibernate,One To One,我正试图建立一对一的关系。在所有者端,bookins(非主键)指的是目标实体的主键。 现在的问题是,如果我想阅读所有评论(reviewRepository.findAll()),如果给定的booksin没有可用的书籍,则会引发以下错误: Unable to find com.repository.model.Book with id 1 但是预期的行为是,如果找不到书,则book实体将被简单地设置为null。就像我使用reviewId来加入列@JoinColumn(name=“review\u

我正试图建立一对一的关系。在所有者端,
bookins
(非主键)指的是目标实体的主键。 现在的问题是,如果我想阅读所有评论(
reviewRepository.findAll()
),如果给定的
booksin
没有可用的书籍,则会引发以下错误:

Unable to find com.repository.model.Book with id 1
但是预期的行为是,如果找不到书,则book实体将被简单地设置为
null
。就像我使用
reviewId
来加入列
@JoinColumn(name=“review\u id”,…)
而不是
review\u isn
一样

有人能解释为什么它使用主键,而不是非主键属性吗?需要做什么才能使它也适用于非主要属性

以下两类:

Review.java:

@实体
@资料
@表(name=“review”)
公开课复习{
@身份证
@列(name=“review\u id”)
私人字符串综述;
@列(name=“book\u isn”)
私有字符串;
@奥内托内
@连接柱(
name=“book\u不存在”,
referencedColumn=“书本”,
可插入=错误,
可更新=错误)
私人书籍;
}
Book.java:

@实体
@资料
@表(name=“book”)
公共课堂用书{
@身份证
@列(name=“book\u isn”)
私有字符串bookId;
@列(name=“book\u name”)
私有字符串书名;
}

首先,我不得不说,我不建议您将
@Data
lombok注释与hibernate实体类一起使用。参见示例文章

然后,我建议您通过以下方式更正
查看
实体映射:

import javax.persistence.Transient;
@实体
@表(name=“review”)
公开课复习
{
私人字符串综述;
私人书籍;
@身份证
@列(name=“review\u id”)
公共字符串getReviewId()
{
回顾;
}
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“book\u isn”)
公共图书
{
还书;
}
//为简洁起见省略了setters
@短暂的
公共字符串getBookId()
{
还书!=null?book.getBookId():null;
}
}
您可以通过以下方式保留
查看
实体:

Book b1=新书();
b1.受挫儿童(“BK1”);
b1.setBookName(“第1册”);
评审r1=新评审();
r1.setReviewId(“r1”);
r1.立根簿(b1);
会话(r1);
评审r2=新评审();
r2.setReviewId(“r2”);
session.persist(r2);//对于R2审查,book_为空

另外,请注意,由于潜在的性能问题,使用字符串作为大型表的主键类型。

book\u isn
列是
book(book\u isn)
的外键,因此如果它不是
null
,它应该是对
book
表的正确引用。因此,如果我理解正确;如果在
查看
实体上为
图书isn
提供了一个值,则必须有一个对该
图书isn的
图书
实体的引用?是的,完全正确……好的,很清楚,谢谢!但是我必须如何更改它以允许有空引用?因为这就是我想要实现的。指定的
book\u isn
可能有或可能没有对某本书的引用。请尝试使用@OneToOne(可选=true)