【问题标题】:Save data to database via Spring Data repository通过 Spring Data 存储库将数据保存到数据库
【发布时间】:2018-02-02 23:49:16
【问题描述】:

我计划存储多个表中的数据,这些表具有一对多的 JPA 关系。我正在创建从 JPARepository 扩展的存储库接口。我的问题是,如果我想在关系的多方面保存数据(在下面的场景中是 Tour),那么我应该使用 TourRepository 还是 PersonRespository?

类似地,为需要存储数据的每个 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;
...

【问题讨论】:

  • 在@oneToMany 上添加级联类型,并使用人员将两者保存到数据库中
  • 正如 Gusti Arya 所说,在这里添加适当的级联类型会有所帮助。但是,是否创建存储库取决于更高级的东西:如果您的Tour 是可以单独管理的东西,那么您应该有自己的存储库。只有在不为父子关系创建子存储库的情况下,我才会明确避免创建存储库,其中父是聚合根(在域驱动设计术语中)。

标签: spring jpa spring-data spring-data-jpa


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    然后为 person 创建存储库以保存带有 tours 列表的 person 对象。

    CascadeType.ALL 表示持久化会将所有 EntityManager 操作(如PERSIST, REMOVE, REFRESH, MERGE, DETACH)传播到相关实体。

    【讨论】:

      【解决方案3】:

      您有两个独立的实体。 Person 可以在没有Tour 的情况下存在,Tour 可以在没有Person 的情况下存在。因此,您应该有两个存储库 - 供 Person 和 Tour 独立存储其数据:

      Tour tour1 = new Tour("tour1");
      tourRepo.save(tour1);
      
      Person person1 = new Person("person1");
      person1.addTour(tour1);
      personRepo.save(person1);
      

      您选择了双向一对多关联,因此您必须使用类似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

      【讨论】:

      • 这是有道理的,并且根据我的要求,如果没有我可以从 Person 存储库中实现的 One Side 实体('Person'),实体的多面(在此示例中为“Tour”)就不能存在您通过添加 addTour..method 提到。但是,对于查找或删除个人“Tour”,我仍然需要一个单独的 ('TourRepository') 存储库,我相信吗?我将通过链接了解更多详细信息。
      • @SujitTripathy 如果您要独立于Person 删除/查找Tour,您必须创建TourRepo。依赖实体的一个示例可以是:订单及其行 - 在这种情况下,我们只需要使用一个 OrderRepo。
      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 2017-06-16
      • 2021-03-08
      • 2014-02-17
      • 2022-01-07
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多