通过Spring数据存储库将数据保存到数据库
问题描述:
我打算存储来自多个具有一对多JPA关系的表的数据。我正在创建从JPARepository扩展的Repository接口。我的问题是如果我想在关系的许多方面保存数据(在下面的场景中是Tour),那么我应该使用TourRepository还是PersonRespository?通过Spring数据存储库将数据保存到数据库
在类似的笔记上为每个需要存储数据的JPA实体创建单独的存储库类是否理想?或有限的存储库类的任何更好的方式数据存储到数据库可以实现?
@Entity
@Table(name="Person")
public class Person implements Serializable{
...
...
@OneToMany(mappedBy = "person")
private List<Tour> tours;
...
@Entity
@Table(name = "Tour")
public class Tour implements Serializable{
...
...
@ManyToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
...
答
你有两个独立的实体。 Person
可以存在没有Tour
和Tour
可以存在没有Person
。所以,你应该有两个库 - 为个人和Tour独立存储数据:
Tour tour1 = new Tour("tour1");
tourRepo.save(tour1);
Person person1 = new Person("person1");
person1.addTour(tour1);
personRepo.save(person1);
您选择了双向one-to-many关联,所以你必须使用一个“帮手”的方法一样addTour
到两个实体链接:
public Person addTour(Tour tour) {
tour.setPerson(this);
this.tours.add(tour);
return this;
}
附加信息:Best Practices for Many-To-One and One-To-Many Association Mappings
答
添加cascade
到tours
:
@OneToMany(mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<Tour> tours;
当您保存person
对象,他tours
将被自动保存。
顺便说一句,在Person
类,你应该有一个addTour(...)
公用事业方法是这样的:
// Person.java
public void addTour(Tour tour){
this.tours.add(tour);
tour.setPerson(this);
}
答
我建议你在Person
实体上@OneToMany映射使用CascadeType.ALL
:
@OneToMany(mappedBy = "person",cascade = {CascadeType.ALL})
private List<Tour> tours;
然后创建存储库以供人员用巡视列表保存人员对象。
CascadeType.ALL
意味着持久性将传播像PERSIST, REMOVE, REFRESH, MERGE, DETACH
这样的所有EntityManager操作给相关实体。
您@OneToMany添加级联型,并使用人既保存到数据库 –
作为古斯蒂阿里亚说,加入适量的级联式将在这里帮助。但是,创建存储库还是取决于更高层次的东西:如果你的Tour是可以单独管理的,你应该有自己的Repository。我明确地避免仅在未创建用于父 - 子关系的子存储库的情况下创建存储库,父 - 子关系是父集合的根(在域驱动设计术语中)。 –