2017-08-25 187 views
1

我打算存储来自多个具有一对多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; 
... 
+0

您@OneToMany添加级联型,并使用人既保存到数据库 –

+1

作为古斯蒂阿里亚说,加入适量的级联式将在这里帮助。但是,创建存储库还是取决于更高层次的东西:如果你的Tour是可以单独管理的,你应该有自己的Repository。我明确地避免仅在未创建用于父 - 子关系的子存储库的情况下创建存储库,父 - 子关系是父集合的根(在域驱动设计术语中)。 –

回答

1

你有两个独立的实体。 Person可以存在没有TourTour可以存在没有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

+0

这是有道理的,并根据我的要求,实体的许多方面(在这个例子中'旅游')不能存在没有一个侧面实体('人'),我可以从个人存储库实现,如你所提到的添加addTour ..方法。但是,对于查找或删除个人“游览”,我仍然需要一个单独的('TourRepository')存储库,我相信?我将通过链接了解更多细节。 – Sujit

+0

@SujitTripathy如果您要从'Person'独立删除/查找'Tour',则必须创建TourRepo。依赖实体的一个例子可以是:Order和它的行 - 在这种情况下,我们只需要使用一个OrderRepo。 – Cepr0

1

添加cascadetours

@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); 
} 
1

我建议你在Person实体上@OneToMany映射使用CascadeType.ALL

@OneToMany(mappedBy = "person",cascade = {CascadeType.ALL}) 
private List<Tour> tours; 

然后创建存储库以供人员用巡视列表保存人员对象。

CascadeType.ALL意味着持久性将传播像PERSIST, REMOVE, REFRESH, MERGE, DETACH这样的所有EntityManager操作给相关实体。