按两个唯一字段 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 列。