gpt4 book ai didi

java - 可以安全地假设 @Transient 使 JPA 提供者始终保留带注释的字段吗?

转载 作者:行者123 更新时间:2023-12-05 02:51:48 28 4
gpt4 key购买 nike

this answer 启发我开始更详细地研究 JPA 的 @Transient 注释的功能。在提到的答案中:

One merge or refresh too many and your transient field value is lost.

然后我看过的每份文档都说大致相同:

Fields annotated with @Transient are not persisted

我没有发现完全忽略这样一个字段,我意识到我没有明确的证据,但不知何故我总是隐含地理解它,就像@Transient 注释字段被 JPA(提供者)忽略 .

举个例子,如果这样的字段永远不会持久保存在数据库中(我的意思是持久保存在 JPA 上下文中),是否有必要从数据库中获取该字段。为此,我猜有 @Column(insertable=false, updatable=false)?

那么我是否真的应该意识到实体的合并刷新,无论在操作时是否被管理,都会使一些@Transient 字段更改?

如果是,这种情况的简单示例是什么?

最佳答案

  • 我想考虑 3 种情况

    • 在非托管实体上调用 merge,其中非托管实体填充了 transient 字段
    • 在托管实体上调用 merge,其中托管实体在成为托管实体后填充了一个 transient 字段
    • 在托管实体上调用刷新,其中托管实体在成为托管实体后填充了一个 transient 字段。无论如何都不允许在非托管实体上调用 refresh
  • 对非托管实体调用 merge,其中非托管实体填充了 transient 字段

    • 实现可自由返回新实体,这意味着 transient 字段丢失。我已经用 hibernate 验证了行为,它失去了值(value)。即使某些实现使其不会失去值(value),我也不会依赖它,因为合并可以免费返回新实体。
  • 在受管实体上调用 merge,其中受管实体在成为受管后用 transient 字段填充

    • 它是一个托管实体,因此 JPA 需要提供可重复读取。因此,即使您执行 merge,JPA 也必须满足这两个保证,即您对托管实体的对象引用不能更改,并且该对象应包含来自 db 的最新值。 JPA 没有理由触及您的 transient 字段。它只会更新任何在数据库中被管理和更新的字段。我已验证此行为并按预期运行。
  • 在受管实体成为受管后调用临时字段填充的受管实体的刷新

    • 与合并受管实体的论点相同。 JPa 不会丢失您的 transient 值。我已验证此行为并按预期运行。

总结

  • 调用合并时,您将丢失非托管实体的临时值。

GitRepo

关于java - 可以安全地假设 @Transient 使 JPA 提供者始终保留带注释的字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63003677/

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