- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 Java 应用程序(Spring Boot、Spring Data、Spring Data JPA),我正在建模一个缓慢变化的维度类型 2 数据库表。
我想知道如何以最佳方式设计按键:
我有:
@Id
private String partId;
@Id
private Date validFrom;
private Date validTo;
如果该行有效,
validTo 会获取 9999-12-31
。
如果需要创建新行,旧行将终止:validTo
设置为 now
对于新行,validFrom
设置为 now
。
如何确保只有一行 validTo
= 9999-12-31
存在,并且只有一行 validFrom
= 现在
?
如果我这样设计:
@Id
private String partId;
private Date validFrom;
@Id
private Date validTo;
我可能会失去一致性,因为存在多个具有相同 validFrom 日期的终止行。
如果我将两个日期都设置为键的一部分,我会失去更多的一致性控制。
最佳答案
简短回答:JPA 不允许您轻松执行此类检查。您应该直接验证代码中的数据状态,并且仅在确定对该操作感到满意后才发送一些内容供 JPA 插入。
长答案:一般来说,在 JPA 层执行这种验证的机会很少。从设计上来说,JPA 是保存在数据库中的简单数据模型的愚蠢表示。假设当数据到达应用程序的 JPA 层时,它已经通过了业务逻辑层的业务逻辑验证。
本质上,我们想要实现的业务逻辑如下:
For every
partId
, no more than one entry in the table is allowed to exist which has avalidTo
property set to a future time
现在,碰巧的是,您当前的应用程序实现是这样的,将来应该出现的唯一日期是 9999-12-31
,因此我可以看到您可能会如何考虑利用数据库的独特约束来实现业务逻辑的偷工减料版本。这是一个糟糕的主意,原因很简单:这不是数据库约束的用途。
数据库约束的存在是为了帮助数据库发挥其功能:快速、高效、准确地回答您的查询。数据库的工作不是过滤掉违反业务规则的数据输入,而是数据库的工作是过滤掉会阻止数据库正常运行的数据输入。如果您尝试插入重复的主键,这不是不行,因为它破坏了您的业务逻辑,而是不行,因为它破坏了数据库数据模型。您无法将第二个主键插入到数据库表中,原因与您无法将两个独立但相同的键放入 HashMap
中的原因相同,它只是在功能上不起作用。
If a rule doesn't have to do with helping the database be faster and more reliable (i.e. uptime), then it probably doesn't belong on the database
话虽这么说,很多数据库(包括MySql)确实有在数据库层实现业务逻辑的工具。这是因为确实有开发者认为这是一个好地方。没事儿。然而,JPA 并没有公开该功能,因为 JPA 的设计目的是使数据存储尽可能“愚蠢”。如果您想在 JPA 的范围之外实现这样的约束,可以使用触发器等数据库概念来完成。您可以自由地将这些类型的验证实现为数据库触发器,但 JPA 可能不会参与其中。
关于java - MySQL : Define Non Key as Unique per Compound Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47843575/
假设有一条SQL语句: select * from A order by cola 在sqlalchemy中,我们可以使用以下代码: session.query(A).order_by(asc(col
在语句中调用函数sum(int [], arr_size) total = sum((int []){1,2,3,4,5}, 5); 复合文字 (int []){1,2,3,4,5} 作为参数传递。很
有一个MySQL的查询。这种查询在前端很容易解决,但需要MySQL中的一种机制。你如何计算 1 列中的 2 个不同项目?例如:我有这张 table : NAME FRUIT A APPLE
我有一个功能齐全的复合 PostgreSQL 查询... SELECT * FROM (SELECT date_trunc('day', date) date, (array_agg(open ORD
我有一个 LINQ 实体,我需要为其创建一个特殊的字符串值。它是由“-”分隔的 7 个不同的值。使用的一些字段在该表中,而其中一些在不同的表中。我想以某种方式将这个字段添加到实体中,这样我就不必在每次
我正在实现我自己的内容提供程序,因为我要将我的数据库与服务器同步。我的数据存储在 SQLiteDatabase 中,我的一些表有一个复合主键(2 列,每列都是另一个表的外键)。 我刚开始使用 Cont
我想用复合位图创建一个 TextView,我知道 android 支持用复合可绘制对象创建 TextView,但我想在在线下载图片时复合位图 注意:我不想让 LinearLayout 包含 image
我正在尝试读取 .pdb 文件,因此我的代码中有很多变量。为了减少它们(并避免段错误),我想知道是否可以使用外部参数在我的代码中分配数组名称。 我的代码 foo.cpp 的起始位看起来像这样- /*A
我想弄清楚如何更改按钮左侧可绘制图标的颜色。 下面是我使用的 XML 代码: 我试过 android:tint 但图标的颜色没有改变。我被困在这里。 最佳答案 您可以像下面这样以编程方式设置色调
我试图将 jade 设置为复合 js 中的默认模板引擎。当我浏览我发现的文档时 Templating engines By default railway use ejs templating eng
我对复合触发器有疑问。 :new.value 在每一行之前部分是空白/空的,当一个之后部分被指定。 创建表格部分: DROP TABLE test_tab; CREATE TABLE test
正如标题所说,我如何加入/约束 2 个 pymunk 体/形状,使它们不作为一个单独的对象? 例如,在这种情况下,我有一个板 Racket ,由 2 个独立的主体和多边形组成。 我想将 bat 的“
Tridion 模板生成器错误 从模板生成器打开复合模板时,我们收到错误消息 “无法加载文件或 Assembly Tridion.ContentManager.TemplateTypes Ver 5.
我正在编写一个金融市场数据分发应用程序作为我的 M.S 项目的一部分。该应用程序即将完成,但该应用程序的扩展性不佳。 这就是它的工作原理,我订阅了一个“假”交易所来获取市场数据。 订阅后,我得到一个初
是否可以定义一个 CSS 样式,使其默认包含另一个样式? 例如,参加以下类(class): .rounded{ -webkit-border-radius:5px; -moz-border-r
我有一个 Activity 表,其中显示哪些用户关注谁。 (fromUser 和 toUser)我正在构建一个排行榜,以查看关注者中谁的评分最高。 所以我创建了这个查询: ParseQuery que
我正在尝试使用 获取以下每个元素 element = driver.findElement(By.className("code-list-item code-list-item-public "))
我有 2 个表,结构如下: CREATE TABLE `exp_ws_gk_text` ( `WGT_RID` INT(9) NOT NULL AUTO_INCREMENT, `WGT
我有一个包含指向回调函数的指针的结构,如下所示: typedef void (*LOAD_CB)(resource* r); typedef void (*UNLOAD_CB)(resou
我正在使用 C++ amp 编写模拟代码。我有以下问题,但找不到明确的答案。希望有人能帮忙。实际上,它们是相互关联的。 我写了一些像这样的行并且它有效,我已经测试了结果但我需要有人指出它为什么是对或错
我是一名优秀的程序员,十分优秀!