同一应用程序中的JPA / Eclipselink和JDBC Connections

时间:2013-11-14 15:24:54

标签: java jpa eclipselink

我想在同一个应用程序中通过JPA / Eclipselink和JDBC Connections访问持久层。

问题是,即使我之后打开新创建的EntityManager,直接使用JDBC Connections进行的更改也不会反映到JPA EntityManagers中。

我正在使用Tomcats JDBC-Connection池,JDBC Connections和JPA EntityManagers。

有没有办法处理这种“冲突”?我发现了这个:Disable caching in JPA (eclipselink)

我也发现了这个:http://wiki.eclipse.org/EclipseLink/Examples/JPA/EMAPI#Getting_a_JDBC_Connection_from_an_EntityManager但我不喜欢这个想法,因为使用JDBC-Connections的代码位于一个单独的库中,根本不应该使用JPA。

是否有与JDBC-Connections和JPA / Eclipselink-Connections同样工作的最先进解决方案?

2 个答案:

答案 0 :(得分:1)

您是否尝试过禁用共享缓存? JPA允许两级缓存 - 在工厂(共享)级别和EM本身内部,以保持托管实体。如果您在JPA之外进行更改,则需要考虑这些缓存。使用JPA的连接不会解决这个问题,因为它仍然没有挂钩到JPA的缓存中。因此,只有清除了em或更新了涉及更改的实体,才能看到EM外部的更改。

我会用 http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching 詹姆斯在堆栈溢出问题中提供的http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching链接作为参考。

在同一个应用程序中使用JDBC与在不同的应用程序中进行更改基本相同,只是JPA应用程序可能对所做的更改有更多的控制和知识,允许发生特定的失效或刷新。因此,虽然禁用共享缓存可能是最简单/最快的解决方案,但EclipseLink失效和有针对性的刷新可能仍然可以获得缓存的好处。

答案 1 :(得分:0)

我想回答一下我自己的问题。

在我的情况下,我有一系列操作:

  1. 使用JPA EntityManager
  2. 使用JDBC连接
  3. 使用JPA EntityManager
  4. 在上面的场景中,可以在步骤3中处理无效数据。

    以下是一系列有效的操作:

    1. 使用JPA EntityManager
    2. 关闭EntityManager
    3. 使用JDBC连接
    4. 关闭JDBC连接
    5. 创建新的JPA EntityManager
    6. 刷新所有缓存: em.getEntityManagerFactory().getCache().evictAll();(1)
    7. 使用JPA EntityManager
    8. 在这个特殊的操作序列中(当一个人必须在并发环境中工作时,它会有所不同),它比为整个应用程序禁用缓存更好。

      对于这个问题的更一般的回答,请参阅上面的Chris anwser。

      (1)http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching