JPA OneToOne 中的条件实体创建

Conditional entity creation in JPA OneToOne

我的 Employee 需要有一个角色,以后可以用其他属性扩展。因此,我想将它们保留为单独的实体。

Employee class 中,我引用了这样一个角色:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "role_id", referencedColumnName = "id", nullable = false)
private EmployeeRole role;

EmployeeRole class 只有数字 id 属性和描述 String.

目标

每当我创建 Employee 类型的实体时,我只想指定角色的 description,而不是其 id。如果具有这样 description 的角色已经存在,则它的 id 将用作 Employee 关系上的 role_id 外键。

否则,将创建一个新角色。

当前行为

为每个 Employee 创建新的 EmployeeRole。如果我将 description 设置为唯一:

@Column(unique = true)
private String description;

如果具有指定描述的角色已经存在,则不会创建 Employee

解决方案?

一个可能的解决方案是检查具有此描述的 EmployeeRole 是否已经存在,如果不存在则创建它,并且在这两种情况下都利用其 id 映射一个新的 Employee 到它。

老实说,我不知道如何在 class 声明中做到这一点。任何建议表示赞赏。

也许这不是您要查找的内容,但您可以通过描述查询 EmployeeRole 并为您的员工重用该实体(如果存在)或创建一个新实体(如果不存在)。如果您使用 JpaRepository,您可以在界面中像这样在其中编写一个方法,以通过描述列创建查询:

EmployeeRole findFirstByDescription(String description);

从技术上讲,您可以将方法命名为:

EmployeeRole findByDescription(String description); 

但是,如果您出于某种原因不小心创建了多个具有相同描述的 EmployeeRoles,那么它将无法工作,因此通过使用“findFirst..”您可以消除它以防万一。