将JPA与普通JDBC dao实现混合使用时会出现什么问题



我们有两个团队,他们希望使用不同的技术访问同一个数据库。其中一个使用JPA(具体地说是Hibernate)。另一个使用纯JDBC。

我被要求编制一份关注点列表,假设每个团队都使用每种技术的默认配置和/或"最佳实践"。

这是一个新的数据库,所以想象一下这个模式是由JPA团队单独设计的,或者是由JDBC团队单独设计,然后他们都开始尝试访问它

你能分享一下你的经历吗?

更新:我不是在这里征求意见。我不在乎JPA还是JDBC"更好"。我要求在混合使用这两种技术时提供一份关于互操作性问题的客观清单。


下面是我要找的一个例子:

场景:用户读取一行,在内存中对其进行修改,然后将其保存回数据库。

  • 如果JPA通过向每个表添加version列来使用乐观锁定
  • 提交事务时,JPA会检查在读取行和更新行之间版本是否发生了更改。如果版本发生更改,则会引发异常。如果没有,则允许继续提交
  • 如果JDBC实现使用表锁(也称为悲观锁),则使用SELECT ... FOR UPDATE来防止并发更新
  • 想象一下,如果JDBC实现不知道JPA约定,并且在提交时不更新version,会发生什么:

    1. JPA使用SELECT读取一行,并看到version等于1
    2. JDBC使用SELECT ... FOR UPDATE读取一行
    3. JDBC在不递增version的情况下更新行(提交其事务)
    4. JPA尝试更新该行。提交通过是因为version仍然等于1
    5. JPA(步骤4)刚刚破坏了JDBC的更新(步骤3)

经验教训:JDBC实现需要知道如何更新version列。

在等待其他人回答时建立自己的列表:

  1. JPA默认使用乐观锁定。这需要添加一个版本列,并在每次更新行时将其递增。JDBC也必须这样做
  2. 发散的DAO层更有可能以发散的模型结束。也就是说,任何时候JPA映射配置发生更改,相应的JDBC代码都可能静默地中断
  3. 如果JPA使用级联规则来传播更新或删除。JDBC也必须这样做
  4. 如果使用JPA@Id @GeneratedValue(strategy=GenerationType.SEQUENCE),则创建并使用序列表(例如hibernate_sequence)。JDBC也必须这样做
  5. JDBC需要支持JPA类继承表
  6. 如果JPA推动模式进化,JDBC实现将需要添加对其约定/特性的支持。另一方面,如果JDBC驱动模式进化,那么我们需要禁用影响模式的JPA特性
  7. 如果在JPA之外修改数据,则无法使用JPA二级缓存(由crizzis提供)

最新更新