如何在运行时知道 POJO 的 ID (@GenerateValue)

2024-04-17

我有一个表格可以填写 POJO,名为Father。在里面,我有一个FotoFather field.

当我保存一个新的 Father 时,我会自动保存 FotoFather 对象(使用 Hibernate ORM 模式)。

FotoFather.fotoNaturalUrl必须填写的值Father.id问题就在这里!

当我存钱的时候Father在数据库上,当然我还没有Father.id填充值FotoFather.fotoNaturalUrl。我怎么解决这个问题?

谢谢

@Entity
@Table(name = "father")
public class Father implements Serializable{    
    ...
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    ...
    @OneToOne(targetEntity = FotoFather.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "fotoFather", referencedColumnName = "id")
    @Cascade(CascadeType.ALL)
    private FotoFather fotoFather;
}

FotoFather.class

@Entity
@Table(name = "foto_father")
public class FotoFather.class{

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    ...
    @Column(name = "foto_natural_url")
    private String fotoNaturalUrl;
    ...
}

如果您只是需要完整的 URL 来实现某些特定于应用程序的目的,那么我可能会犯错误,根本不尝试将 URL 与 ID 一起存储,而是依赖瞬态方法。

 public class FotoFather {
   @Transient
   public String getNaturalUrl() {
     if(fotoNaturalUrl != null && fotoNaturalUrl.trim().length > 0) {
       return String.format("%s?id=%d", fotoNaturalUrl, id);
     }
     return "";
   }
 }

事实上,将 URL 进一步分解为极简的变量组件并仅将它们存储在单独的列中可能会带来技术债务,特别是在 URL 发生变化的情况下。这样,基本 URL 就可以是应用程序可配置的,并且控制最终 URL 端点的变量方面都是您所存储的。

但是,如果您必须提前知道 ID(或者像我最近的情况一样,保持标识符连续而不丢失单个值),则需要在以下位置处理此问题:FotoFather标识符是在持久化实体之前生成的,因此它们不是@GeneratedValues.

为了避免插入时发生冲突问题,我们有一个序列服务类,它公开了对按名称获取下一个序列值的支持。序列表行在读取时被锁定,并在提交时更新。这可以防止多个会话出现相同序列的并发问题,防止范围内出现间隙,并允许提前了解标识符。

 @Transactional
 public void save(Father father) {
   Assert.isNotNull(father, "Father cannot be null.");
   Assert.isNotNull(father.getFotoFather(), "FotoFather cannot be null.");
   if(father.getFotoFather().getId() == null) {
     // joins existing transaction or errors if one doesn't exist
     // when sequenceService is invoked.
     Long id = sequenceService.getNextSequence("FOTOFATHER");
     // updates the fotofather's id
     father.getFotoFather().setId(id);        
   }
   // save.
   fatherRepository.save(father);
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在运行时知道 POJO 的 ID (@GenerateValue) 的相关文章

随机推荐

  • 如何创建一个携带数据的android Intent?

    我可能误解了意图的使用方式 所以我可能在这里问了错误的问题 如果是这样的话 无论如何请帮助我走上正确的轨道 我刚刚开始开发一个 Android 应用程序 它会经常轮询我的服务器以获取消息 当有新消息可用时 我想将其显示给用户 我正在尝试通过
  • Android Studio 3.1.1 更新后,“定位”链接无法打开生成的 APK 文件夹

    更新 Android 3 1 1 更新后出现问题 APK 生成过程完成后 Android Studio Windows 操作系统 会弹出一个窗口来定位或分析 APK 不幸的是 如果我点击locate 什么也没有发生 UPDATE 在 APK
  • 解析器 - 调用 yytext 时出现分段错误

    我的解析器正在识别语法并使用 yylineno 指示正确的错误行 我想打印导致错误的符号 int yyerror string s extern int yylineno defined and maintained in lex yy c
  • 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法之间有什么区别?

    add rd rs rt addu rd rs rt sub rd rs rt subu rd rs rt 在MIPS中 有符号加法 无符号加法 有符号减法和无符号减法之间有什么区别 如果它们的结果相同 那么分类为使用有符号和无符号方法有什
  • 使用 javascript 在 Android 中更改方向

    document addEventListener orientationChanged updateOrientation 我正在尝试调用一个函数updateOrientation 但该函数只是没有被调用 我正在使用 javascript
  • Bixby:如何获取基于我的位置的信息?例如天气等

    我看到了bixby studio的开发指南并测试了提供的示例 我想要一些更复杂 但非常重要 的服务 例如基于我所在位置的天气信息 此功能在 bixby studio 的当前状态下可用吗 如果可能的话 请告诉我如何做 这是一段可能对您有帮助的
  • 在 C/Linux 中显示图像的最简单方法是什么? [复制]

    这个问题在这里已经有答案了 我很习惯用 C 进行数值计算 但不擅长图形编程 我在 Linux gcc ubuntu 的命令行程序中有一个 Nx x Ny x 3 RGB 矩阵 我想弹出一个窗口 将其作为图像 做到这一点最简单的方法是什么 它
  • SQL - 转换日期时间格式

    我尝试更改 MySQL 上的日期时间格式 T 得到了一个包含一些列的历史表 其中一些列都具有这种格式 DATETIME JJ MM AAAA HH MM 我需要更改为 AAAA MM JJ HH MM SS 我没有 SS 的变量 我想取 0
  • 最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有什么区别?

    最小sdk版本 目标sdk版本 和 编译sdk版本 有什么区别 我知道 min 和 target sdk 是什么意思 但是编译 sdk 版本是什么意思 在 Eclipse 中 我有最小 最大和目标 sdk 但在 android studio
  • Facebook Open Graph 未显示在时间线上

    我在我的应用程序中使用 FB Open Graph 它没有完全发挥作用 当我发布一个对象时 它会出现在用户最近的活动中 然而 它并没有出现在他们的时间表上 元数据没有错误 我正在使用 FBGraph gem 但当我使用curl 执行此操作时
  • SQL 中将月份编号转换为月份名称函数

    我在 SQL Server 中存储了月份 1 2 3 4 12 我想将它们显示为一月 二月等 SQL Server 中是否有类似 MonthName 1 January 的函数 如果可能的话 我试图避免使用 CASE 语句 我认为这是获得月
  • 如何在 Qt5 中创建/读取/写入 JSON 文件

    Qt5 有一个新的 JSON 解析器 我想使用它 问题在于 用外行术语来说 这些函数的作用以及如何用它编写代码并不太清楚 否则我可能读错了 我想知道在 Qt5 中创建 JSON 文件的代码以及 封装 的含义 示例 从文件中读取 json t
  • XML 文本提取

    设想 给定以下 XML 文件
  • python 3 打印生成器

    当我处理 print 函数 Python 3 时出现问题 当我寻找一系列的总和时 我可能会使用以下代码模式 gt gt gt sum i for i in range 101 但是当我倾向于检查我制作的系列时 我选择 print 并假设它会
  • 智能表,onclick事件

    是否可以在智能表上处理 onClick 事件 我已经注释了来自后端的数据 单击某个条目时 我想导航到一个新视图 显示与我单击的条目关联的所有数据 我怎样才能在 SAPUI5 中实现这一点 我可以在 JavaScript 控制器中使用 get
  • React Navigation - 从选项卡栏打开模式

    使用 React Navigation 6 我将底部选项卡设置为我的主导航器 export function TabNavigator const getColor focused color gt focused palette blue
  • 404 尝试将 Ocelot 中的上游路径路由到下游路径

    我在将传入的 http 请求转发到下游路径时遇到此警告 错误 Ocelot DownstreamRouteFinder Middleware DownstreamRouteFinderMiddleware 警告 requestId 8000
  • SAPUI5 oTable 一行作为链接,其他作为文本视图

    目前我有一个 sapui 表 我希望其中一行是链接 所有其他行应该是文本视图 我的问题是 构建表是基于列 oTable addColumn new sap ui table Column label new sap ui commons L
  • vue.js 中的 $http.get() 与 axios.get() 有什么区别?

    我有点困惑理解之间的主要区别 http get and axios get 我查阅了很多资源 但没有得到满意的答案 有人可以帮我吗 http 是一个全局变量 可能是您在 vuejs 项目中定义的 请在您的项目中搜索 http 您可能会发现它
  • 如何在运行时知道 POJO 的 ID (@GenerateValue)

    我有一个表格可以填写 POJO 名为Father 在里面 我有一个FotoFather field 当我保存一个新的 Father 时 我会自动保存 FotoFather 对象 使用 Hibernate ORM 模式 FotoFather