如何解决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 举报,一经查实,本站将立刻删除。