gpt4 book ai didi

java - Hibernate @Check 以确保在列中仅出现一次特定值

转载 作者:行者123 更新时间:2023-12-01 13:45:20 24 4
gpt4 key购买 nike

我正在实现一个用于存储用户角色的表,该表具有列 user_idrole。业务需求是应该有一个约束,即 role 列只能存在一个值为“ROLE_ROOT”的记录。 role 列中的任何其他值的记录数没有限制。

例如:

有效:

role         |user_id|
-------------|-------|
ROLE_ROOT | 3|
ROLE_CUSTOMER| 5|
ROLE_CUSTOMER| 9|

无效:

role         |user_id|
-------------|-------|
ROLE_ROOT | 3|
ROLE_ROOT | 4|
ROLE_CUSTOMER| 5|
ROLE_CUSTOMER| 9|

在持久化数据时,绝对不能出现以下情况。

我最初考虑在表上使用触发器来在任何插入之前检查此约束,但我被要求不要实现触发器或任何特定于数据库的功能并仅使用 Hibernate。

这只留下(据我所知)Hibernate 中的 @Check 注释。但是我无法确定要设置的约束,因为检查不能具有聚合函数。有没有办法使用 Hibernate @Check 注释来实现这一点?唯一的其他方法是手动实现,但我想确保在我必须处理的限制条件下,这可以在尽可能低的水平上实现。

最佳答案

@Check只是在实体上设置 SQL 检查约束的一种方法:

Arbitrary SQL CHECK constraints which can be defined at the class,property or collection level.

That is :

a type of integrity constraint in SQL which specifies a requirementthat must be met by each row in a database tableThe constraint must be a predicate. It can refer to a single column,or multiple columns of the table.

相关部分:

Common restrictions

Most database management systems restrict check constraints to asingle row, with access to constants and deterministic functions, butnot to data in other tables, or to data invisible to the currenttransaction because of transaction isolation.

所以它不太可能适用于您的情况,因为您对一行的检查依赖于其他行的内容。

我认为您属于业务规则案例,您应该确保自己在您的工作流程中不违反约束。
你有两种方式:

  • 处理 role 列可能更新的特定情况
  • 通过实现 JPA preUpdate 和 PreInsert 监听器来采用更具交叉性的方法。

最后,没有什么可以阻止您的应用程序代码执行 native 查询,即使使用 JPA。但是,代码审查、单元测试和集成测试也可以尽可能地填补空白。

关于java - Hibernate @Check 以确保在列中仅出现一次特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62889215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com