这个问题与管理ID号有关,以确保我的表格上没有重复的身份。这是一个带有MySQL数据库的Springboot项目。
一些背景:
我有一个用于提交"情节"的HTML表格。每个情节都包含"人",并与Manytomany的"人"有关系。
"情节"被现场工作人员输入并提交到数据库(DB1(中。几个小时后,该剧集由退缩人员手动输入第二个数据库(DB2(。
在我的弹簧附加数据库(DB1(上,我有一个具有本机自动生成的ID字段的人表。DB1还具有一个ID2字段 - 记录DB2中该人的唯一ID。
现场工作人员在输入情节时并不总是可以访问ID2,但是退缩人员会访问。
当我保存新的"情节"时,我需要保存方法来检查数据库中的人ID2是否存在并执行人员的更新(不是创建新的(。
然后删除重复的人。
情节实体:
@Entity
public class Episode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
@Column(name="start_date")
@DateTimeFormat (pattern="dd/MM/yyyy HH:mm")
private Date start_date;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "episode_person", joinColumns = @JoinColumn(name = "episode_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"))
private List<Person> persons;
@OneToOne(cascade=CascadeType.ALL)
//@JoinColumn(name = "id")
private Address address;
个人实体
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long id2;
private String surname;
private String firstname;
private String phoneHome;
@DateTimeFormat(pattern = "dd/mm/yyyy")
private Date dob;
@ManyToMany(mappedBy = "persons", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<Episode> episodes;
情节维持
@Override
@Transactional
public Episode saveEpisode(Episode episode) {
List mergedPeople = personService.mergeDetachedWithAttached( episode.getPersons() );
episode.setPersons( mergedPeople );
return episodeRepository.save(episode);
}
PersonServiceImpl
@Transactional
@Override
public List mergeDetachedWithAttached(List<Person> people) {
final List<Person> results = new ArrayList<>();
if ( people != null && !people.isEmpty() ) {
// loop over every person
for (Person person : people) {
// for current person try to retrieve from db via Id2
Person db2Person = personRepository.findById2( person.getId2() );
// if a person was retrieved use them instead of submitted person
if (db2Person != null ) {
System.out.println("A matching person was found in the db using id2 - this is the person that will be added");
results.add(db2Person);
} else {
results.add(person);
}
}
}
return results;
在提交新剧集的那一刻,我创建了新的人,即使我成功地使用id2将它们从DB1查找并将其添加到了情节中。
。我该如何处理:
我可以根据比较ID2合并重复身份。持有episode_id和person_id的联合表也将需要在合并后删除ID的情况下进行更新。
如果您用2个双向@OneToMany
关联替换@ManyToMany
关联,这要容易得多,这意味着您也映射了关联表。
这样,考虑到您拥有那些重复的Episode
或Person
实体,您可以通过简单地调整关联实体上的@ManyToOne
关联来轻松移动加入的关联。至于重复的Episode
或Person
,您可以如下所述使用UPSERT,或者在通过批处理过程中添加到DB之后进行手动合并。
通常,当您同时运行的多个节点时,您可以使用数据库UPSERT或合并操作。
您可以将UPSERT与Hibernate @SqlInsert
注释相结合。
要处理FK更新,您需要在删除级联策略上使用FK。