插入多多JPA实体时复制数据



当添加一个实体,而该实体本身又存储其他实体时,这些实体在添加时不会检查它们是否存在于数据库中。也就是说,如果我添加一个包含表中已经存在的compemail的leakSource,它们是重复的,并且现有的那些没有链接到leakSource。告诉我怎么修?

@Entity
@Table(name = "comp_emails")
class CompEmails (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
val address: String? = null,
@ManyToMany(cascade = [CascadeType.PERSIST, CascadeType.MERGE], mappedBy = "compEmails")
val leakSources: Set<LeakSource>? = null
)
@Entity
@Table(name = "leak_source")
class LeakSource (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
val source: String? = null,
@ManyToMany(cascade = [CascadeType.PERSIST, CascadeType.MERGE])
@JoinTable(
name = "comp_emails_sites_alert",
joinColumns = [JoinColumn(name = "source_id")],
inverseJoinColumns = [JoinColumn(name = "email_id")]
)
val compEmails: Set<CompEmails>? = null
)
@PostMapping("/add-leak-source")
fun addLeakSource(@RequestBody leakSource: LeakSource) : LeakSource {
leakSourceRepo.save(leakSource)
return leakSourceRepo.getById(leakSource.id!!)
}

LeakSource是关系的所有者方。当您尝试将CompEmail添加到LeakSource时,您应该按顺序执行以下步骤。

1-如果数据库中存在CompEmail:获取它

如果没有:创建它,保存到db并获取保存的实体

compEmail = getById(ceId);
// or
... create compEmail
compEmail = save(compEmail);

2-如果数据库中存在LeakSource:取回

如果没有:创建它,保存到db并获取保存的实体

leakSource = getById(lsId);
// or
... create leakSource
leakSource = save(leakSource);

3-添加CompEmail到LeakSource的CompEmail列表。它应该看起来像这样:

...
leakSource.getCompEmails().add(compEmail);

4-保存LeakSource实体(我们刚刚添加了CompEmail)

其他说明:

cascade = [CascadeType.PERSIST, CascadeType.MERGE]此属性应从CompEmails

中删除。

最新更新