按两个唯一字段搜索弹簧启动的唯一性



我创建了一个子实体:

public class ChildEntity  {
private Long bookNo;
private String bookType;
}

这两个领域在一起是独一无二的。某种数据:

| No | Type      |
|----|-----------|
| 1  | Classical |
| 2  | Classical |
| 2  | Scifi     |
| 3  | Scifi     |
| 1  | Classical | (Error for uniqueness

我创建了此实体以在父实体内搜索。

public class ParentEntity{
@ManyToOne
private ChildEntity child;    
//and other fields here
}

此外,还有 2 个不同的父实体。它们必须是不同的实体,它们有几个不同的领域。但这个子实体很常见。因此,我将使用这些子实体来比较/获取数据表之间的差异,因为该子实体中只有唯一区域。我可以通过该子实体字段获取数据表的差异。

我之所以制作ManyToOne,是因为许多不同的父母可以生同一个孩子。

我在这样的服务中创建父实体:

private createParentEntity(Dto dto){

ParentEntity parent = new ParentEntity();
//set other fields from dto
parent.setAge(dto.getAge);

ChildEntity child = new ChildEntity();
child.setBookNo(dto.getBookNo());
child.setBookType(dto.getBookType());

parent.setChild(child);//here is problem , please look down
}

我的问题是什么,我发表评论的那行。

相同的子实体可以来,所以当我拯救父母时,它会尝试再次保存孩子,并且可能会得到一个唯一的约束错误?我能做什么呢?

因为最后,我将使用 spring 数据在父存储库中进行如下搜索:

parentEntityRepository.findByChild(ChildEntity child);
@UniqueConstraints = {
@UniqueConstraint(
name = "uq_general_checklist_ordinal",
columnNames = {"book_no", "book_type"}
)
}
public class ChildEntity {
@Id
private Long bookNo;

@Id
private String bookType;
}

这是放置两个 ID 的好解决方案吗?或者在这里,我应该先救孩子,检查它是否存在?

ChildEntity child =childRepository.findByBookNoAndBookType(
dto.getBookNo(), 
dto.getBookType()
);//if exists, set to parent. if not, create new and set it?

我会做这样的事情:"或者在这里,我应该先拯救孩子并检查是否存在?

但是,与其先保存孩子,不如使用新 ID 搜索孩子。这样,您可以避免 SQL 异常。如果不存在,仍然不要拯救孩子。将其添加到父项并保存父项。因此,它将拯救孩子。如果存在,请将其添加到新的父级并保存父级。

除非我想大量使用 Hibernate 的第一级缓存等,否则我对紧凑的一对多场景的 goto 方法已经变成了使其成为单向关系,但除了加载部分之外,将所有责任从 Hibernate 手中拿走,自己做。

这使得它变得可预测,并节省了大量时间摆弄Hibernate,并导致其他约定,人们的假设和其他框架的问题(例如,递归到String,equals,hashcode方法,当你让它们自动生成/没有精心制作时(。

为此,我使用:

@OneToMany
@JoinColumn(insertable = false, updatable = false)

在父级,在子级上只有纯 ID 列。

最新更新