微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Data JPA + Hibernate 保存子实体而不先找到父实体

如何解决Spring Data JPA + Hibernate 保存子实体而不先找到父实体

在我看来,如果你想保存子实体,你必须首先找到它们的父实体。但事实并非如此。下面是一个例子。

人员表

public class Person {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  
  @OnetoMany(mappedBy = "person",fetch = FetchType.LAZY)
  private List<Book> books;
}

书桌

public class Book {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  @ManyToOne(fetch = FetchType.LAZY,optional = false)
  @JoinColumn(name = "person_id",nullable = false)
  private Person person;
}

书库

public interface BookRepository extends CrudRepository<Book,Long> {}

坚持过程

// the person(id=1) is in the database.
Person p = new Person();
p.setId(1);

Book book = new Book();
book.setPerson(p);
book.setName("book");

bookRepository.save(book); // no error throws

我想知道为什么最后一个语句是成功的。 person 实例是手动创建的,不是 Spring Data JPA 从数据库中检索的,我认为这意味着 person 实例的状态是瞬态的。

解决方法

根据您的逻辑书和新人,您必须创建这些对象。为什么你认为它应该来自数据库。如果您想通过 findbyId 检索用户,则在 List 中设置新创建的书并在幕后保存用户对象,它将为该用户在数据库中进行更新。

,

您可以使用 personRepository.getOne(1) 返回一个 id 为 1 的人的代理。然后将此对象设置为书上的人将执行您要查找的操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。