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

时间:2017-02-09 21:35:11

标签: database jpa jdbc orm

我们有两个团队想要使用不同的技术访问同一个数据库。一个使用JPA(Hibernate,具体而言)。另一个使用普通的JDBC。

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

这是一个新的数据库,因此假设该模式仅由JPA团队设计,或者仅由JDBC团队设计,然后他们都试图访问它。

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

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

以下是我正在寻找的一个例子:

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

  • 如果JPA通过向每个表添加version列来使用乐观锁定。
  • 提交事务时,JPA会检查版本在读取行的时间与更新时间之间是否发生了更改。如果版本更改,则会引发异常。如果没有,它允许提交继续。
  • 如果JDBC实现使用表锁(a.k.a.悲观锁定),则使用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 个答案:

答案 0 :(得分:0)

在等待其他人回答的同时建立我自己的清单:

  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提供)