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;
}

BookRepository

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的人返回一个代理。将这个对象设置为书上的人将做你想要做的事情。

最新更新