我创建了一个子实体:
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 列。