JOOQ 与休眠行为

Posted

技术标签:

【中文标题】JOOQ 与休眠行为【英文标题】:JOOQ Vs Hibernate behavior 【发布时间】:2013-11-28 16:36:45 【问题描述】:

我们知道Hibernate 有一个非常好的特性SaveOrUpdate,当我们将任何对象传递给此方法时,它知道数据将是update 或将在数据库中添加新记录。这个功能在JOOQ 中是否也可用,或者在我的代码中我必须处理这个?

【问题讨论】:

【参考方案1】:

jOOQ 也是如此。如果更改记录的主键,则使用INSERT,否则使用UPDATE

事实上,当您从数据库中读取一条记录时,调用store() 将触发您所期望的UPDATE。如果您创建一条新记录,那么它将是INSERTed。

在 2.6 中,克隆一条记录然后让 jOOQ 更新它有点困难(因为克隆会在新实例中设置主键,因此将其标记为“新”-> 插入)。

【讨论】:

不,我的意思是 store() 方法与 saveOrUpdate() 相同 “触发 Update()”到底是什么意思? 我认为触发 Update() 查询 我已经详细回答了这个问题。请再次阅读我的回答。 @subodh:在我看来,Aaron 的回答已经很明确了。真的没有什么要补充的了。 store() 执行UPDATEINSERT,具体取决于该记录中是否存在主键信息。我建议您阅读Javadoc on that method,并在您的 Stack Overflow 问题之外(或之前)自己尝试 1-2 件事。【参考方案2】:

如果你从数据库中读取一条记录并调用record.store(),你将拥有与hibernate saveOrUpdate方法相同的行为,它可以完美运行!

但在大多数情况下,您不会从数据库中读取记录,而是会从控制器或视图中接收记录,例如,在这种情况下,方法 record.store() 不会更新,它总是插入即使你设置了 id。

现在我正在实现我自己的 saveOrUpdate,通过记录 ID 检查。

public int saveOrUpdate(Record record) 
    if(record.getId() != null) 
        return record.update();
     
    return record.store();    

【讨论】:

以上是关于JOOQ 与休眠行为的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ - 相当于用于填充历史字段的休眠拦截器?

Hibernate 和 jOOQ 共享事务

休眠保存或更新行为

带有休眠和触发器的乐观锁定 - “奇怪”行为

休眠。 QueryOver Take(n) - 使用 Left.Join

更新期间休眠不刷新