【问题标题】:Conditional entity creation in JPA OneToOneJPA OneToOne 中的条件实体创建
【发布时间】:2022-01-12 00:59:04
【问题描述】:

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

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

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

EmployeeRole 类只有一个数字id 属性和一个描述为String

目标

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

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

当前行为

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

@Column(unique = true)
private String description;

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

解决方案?

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

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

【问题讨论】:

  • 如果你使用@OneToOne,每个Employee需要有一个不同的EmployeeRole(读取id)参考:manytoone-vs-onetoone

标签: java jpa spring-data-jpa


【解决方案1】:

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

EmployeeRole findFirstByDescription(String description);

从技术上讲,您可以只命名该方法:

EmployeeRole findByDescription(String description); 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多