按两个唯一字段 spring 引导搜索唯一性
Search by two unique fields spring boot for uniqueness
我创建了一个 child 实体:
public class ChildEntity {
private Long bookNo;
private String bookType;
}
这两个字段是唯一的。某种数据:
| No | Type |
|----|-----------|
| 1 | Classical |
| 2 | Classical |
| 2 | Scifi |
| 3 | Scifi |
| 1 | Classical | (Error for uniqueness
我创建这个实体是为了在 parent 实体中搜索。
public class ParentEntity{
@ManyToOne
private ChildEntity child;
//and other fields here
}
此外,还有 2 个不同的 parent 实体。他们必须是不同的实体,他们有几个不同的领域。但是这个 child 实体很常见。因此,我将使用那些 child 个实体来比较/获取数据表之间的差异,因为只有独特的区域在 child 个实体中。我可以通过 child 实体字段来区分数据表。
我做了 ManyToOne 因为许多不同的 parent 可以有相同的 child.
我在这样的服务中创建 parent 个实体:
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
}
我的问题是什么,我评论的那一行。
相同的 child 实体可以来,所以当我保存 parents 时,它会尝试再次保存 child 并且会得到一个独特的约束错误?我该怎么做才能做到这一点?
因为最后我会用spring数据在parent仓库里面这样搜索:
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 放在一起是一个好的解决方案吗?或者在这里,我应该先保存child并检查它是否存在?
ChildEntity child =childRepository.findByBookNoAndBookType(
dto.getBookNo(),
dto.getBookType()
);//if exists, set to parent. if not, create new and set it?
我会这样做:“或者在这里,我应该先保存 child 并检查是否存在?”
但是,不是先保存 child,而是搜索具有新 ID 的 child。这样,您就可以避免 SQL 异常。如果不存在,还是不要保存child。将其添加到 parent 并保存 parent。它会因此保存 child。如果存在,将其添加到新的 parent 并保存 parent.
除非我想大量使用 Hibernate 的一级缓存等,否则我对紧密的一对多场景的 goto 方法已变成使这种关系成为单向关系,但除了加载部分外,我承担了所有责任Hibernate 的手,我自己做。
这使得它可以预测并节省大量时间来摆弄 Hibernate 以及其他约定、人们的假设和其他框架的问题(例如递归的 toString、equals、hashcode 方法,当你让它们自动生成/不小心精心制作)。
为此我使用:
@OneToMany
@JoinColumn(insertable = false, updatable = false)
在父项中,在子项中只是简单的 id 列。
我创建了一个 child 实体:
public class ChildEntity {
private Long bookNo;
private String bookType;
}
这两个字段是唯一的。某种数据:
| No | Type |
|----|-----------|
| 1 | Classical |
| 2 | Classical |
| 2 | Scifi |
| 3 | Scifi |
| 1 | Classical | (Error for uniqueness
我创建这个实体是为了在 parent 实体中搜索。
public class ParentEntity{
@ManyToOne
private ChildEntity child;
//and other fields here
}
此外,还有 2 个不同的 parent 实体。他们必须是不同的实体,他们有几个不同的领域。但是这个 child 实体很常见。因此,我将使用那些 child 个实体来比较/获取数据表之间的差异,因为只有独特的区域在 child 个实体中。我可以通过 child 实体字段来区分数据表。
我做了 ManyToOne 因为许多不同的 parent 可以有相同的 child.
我在这样的服务中创建 parent 个实体:
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
}
我的问题是什么,我评论的那一行。
相同的 child 实体可以来,所以当我保存 parents 时,它会尝试再次保存 child 并且会得到一个独特的约束错误?我该怎么做才能做到这一点?
因为最后我会用spring数据在parent仓库里面这样搜索:
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 放在一起是一个好的解决方案吗?或者在这里,我应该先保存child并检查它是否存在?
ChildEntity child =childRepository.findByBookNoAndBookType(
dto.getBookNo(),
dto.getBookType()
);//if exists, set to parent. if not, create new and set it?
我会这样做:“或者在这里,我应该先保存 child 并检查是否存在?”
但是,不是先保存 child,而是搜索具有新 ID 的 child。这样,您就可以避免 SQL 异常。如果不存在,还是不要保存child。将其添加到 parent 并保存 parent。它会因此保存 child。如果存在,将其添加到新的 parent 并保存 parent.
除非我想大量使用 Hibernate 的一级缓存等,否则我对紧密的一对多场景的 goto 方法已变成使这种关系成为单向关系,但除了加载部分外,我承担了所有责任Hibernate 的手,我自己做。
这使得它可以预测并节省大量时间来摆弄 Hibernate 以及其他约定、人们的假设和其他框架的问题(例如递归的 toString、equals、hashcode 方法,当你让它们自动生成/不小心精心制作)。
为此我使用:
@OneToMany
@JoinColumn(insertable = false, updatable = false)
在父项中,在子项中只是简单的 id 列。