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..”您可以消除它以防万一。
我的 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..”您可以消除它以防万一。