Hibernate 一对一映射-Spring数据JPA Spring引导

Hibernate 一对一映射-Spring数据JPA Spring引导,hibernate,spring-boot,spring-data,spring-data-jpa,Hibernate,Spring Boot,Spring Data,Spring Data Jpa,在SpringDataJPA-SpringBoot应用程序中,我需要在两个表之间进行一对一的映射。我在大学里学习了这个例子 它运行良好,并在第二个表(图书详细信息)中插入记录。在我的应用程序中,我需要多次更新第二个表中的记录(如示例中所示,不更新pages列) 我正在阅读book对象,然后更新bookdetail字段,并使用存储库(extends Crudepository)将其保存回来 如果我这样做了10次,bookdetail表对于同一本书有10条记录,在book表中,它引用了该书上次更新

在SpringDataJPA-SpringBoot应用程序中,我需要在两个表之间进行一对一的映射。我在大学里学习了这个例子

它运行良好,并在第二个表(图书详细信息)中插入记录。在我的应用程序中,我需要多次更新第二个表中的记录(如示例中所示,不更新pages列)

我正在阅读book对象,然后更新bookdetail字段,并使用存储库(extends Crudepository)将其保存回来

如果我这样做了10次,bookdetail表对于同一本书有10条记录,在book表中,它引用了该书上次更新的bookdetail记录的键值。但我需要更新同一记录的详细信息。Book中的一条记录详细说明了Book中的一条记录

//对于//实际应用程序代码流中的同一本书,该块可以在同一线程中执行n次

// book = retrieve from Book repo
            if(book.getBookDetail() == null){
                System.out.println("NO BookDetail ");
                BookDetail bookDetail = new BookDetail();
                bookDetail.set...(123)
                book.setBookDetail(bookDetail);
            }else{ 
                book.getBookDetail().set...(123)
            }
            bookRepo.save(book);
我做错了什么

添加实体类

public class Book implements Serializable {
    private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int bookId;


@OneToOne(fetch=FetchType.LAZY ,cascade = CascadeType.MERGE)
@JoinColumn(name="detailId")
private BookDetail bookDetail;

//Other fields

//Getter & Setter

}

public class BookDetail {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int detailId;


@Lob
private String data;

@OneToOne(mappedBy="bookDetail")
private Book book;

//Other fields

//Getter & Setter

}

是否确实要保存书本实体而不更新它?如果你想编辑现有的书籍细节,为什么不编辑引用它的对象而不是创建一个新的对象?

你能发布你的实体模型类吗?用实体类更新但我不会每次都创建一个新的实体模型类这只是第一次当对象不存在时。@oxygenan抱歉,我肯定没有给予足够的关注。但是,如果您更新实体而不是保存它,它的工作方式是否相同?您的意思是编写一个自定义方法来更新吗?我们只有保存方法CrudRepository@oxygenan我不知道,我不太熟悉Spring数据,因为我只使用JPA和JDBC。我想你要找的是孤儿院。您能试着像@OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL,orphanRemoving=true)那样注释bookDetail字段吗?“如果子实体与其父实体分离,则子外键将设置为NULL。如果我们还希望删除子行,则必须使用孤立删除支持。”引用自此处
bookRepo.save(book);