通过Spring Data存储库将数据保存到数据库

时间:2017-08-25 00:26:14

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

我打算存储来自多个表的数据,这些表具有一对多的JPA关系。我正在创建从JPARepository扩展的Repository接口。我的问题是如果我想在关系的多方面保存数据(在下面的场景中是巡回赛)那么我应该使用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;
...

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

我建议您在namespace Crankdesk.CrankHouseControl.ViewModel.Application { public class ConfigurationViewModel : INotifyPropertyChanged { private ObservableCollection<string> _musicBasePathList; public ObservableCollection<string> MusicBasePathList { get { return _musicBasePathList; } set { _musicBasePathList = value; } } public event PropertyChangedEventHandler PropertyChanged; public ConfigurationViewModel() { _musicBasePathList = new ObservableCollection<string>(); _musicBasePathList.CollectionChanged += _musicBasePathList_CollectionChanged; } private void _musicBasePathList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { RaisePropertyChanged(nameof(MusicBasePathList)); } private void RaisePropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } } 实体中对@OneToMany映射使用CascadeType.ALL

Person

然后为人员创建存储库以使用游览列表保存人物对象。

@OneToMany(mappedBy = "person",cascade = {CascadeType.ALL}) private List<Tour> tours; 表示持久性会将CascadeType.ALL之类的所有EntityManager操作传播到相关实体。

答案 2 :(得分:1)

您有两个独立实体。没有Person Tour可以存在,而Tour可以存在Person而不存在Tour tour1 = new Tour("tour1"); tourRepo.save(tour1); Person person1 = new Person("person1"); person1.addTour(tour1); personRepo.save(person1); 。所以你应该有两个存储库 - 用于Person和Tour来独立存储它们的数据:

addTour

您选择了双向一对多关联,因此您必须使用&#39;帮助&#39;像public Person addTour(Tour tour) { tour.setPerson(this); this.tours.add(tour); return this; } 这样的方法来链接两个实体:

public MyListAdapter(Context context, List<String> data, String[] linkler) {
    this.filteredData = data ;
    this.originalData = data ;
    this.gelenLink= linkler;

    mInflater = LayoutInflater.from(context);
}

其他信息:Best Practices for Many-To-One and One-To-Many Association Mappings