【问题标题】:Mix JDO (DataNucleus) and JPA (Hibernate) objects in one transaction在一个事务中混合 JDO (DataNucleus) 和 JPA (Hibernate) 对象
【发布时间】:2012-10-18 10:23:52
【问题描述】:

这会是个问题吗?

我有一个遗留系统,它使用 javax.jdo API 和 XML 映射来处理从数据库中写入/读取它的对象。

我还有一些扩展这个系统的代码,这部分是使用 JPA 和 Hibernate(通过注释,使用 Spring 管理的声明性事务)。

我想把它们放在同一个保护伞下,这样我就可以更好地管理交易。我想重写我的代码以使用 DataNucleus,但我想坚持使用 JPA(所以我不必更改映射等......)。

所以问题是:是否可以在项目的两个部分中混合 JPA 和 JDO 并跨越混合的事务?还是我必须只选择一种方法?

感谢您的帮助。

【问题讨论】:

    标签: hibernate jpa jdo datanucleus


    【解决方案1】:

    这在某些情况下实际上不起作用,基本上休眠和数据核都在持久类上使用自己生成的代理。所以hibernate中生成的代理类在你尝试持久化时不会被数据核识别,因为它是一个代理类。

    【讨论】:

    • 据我所知,DataNucleus 不会生成代理,它使用字节码编织将附加行为注入到原始对象中。相比之下,Hibernate 不会乱用字节码,因此为了完成其任务,它会即时创建代理。对于您的第二点,我并没有说我想用 DataNucleus 持久化 Hibernate 代理。我想切换到 DataNucleus 实现并保留 JDO 和 JPA 注释和 API。抱歉,不清楚。
    【解决方案2】:

    DataNucleus 显然将允许您使用 JDO 或 JPA 注释(或同时使用 IIRC),并使用 JDO 或 JPA 使用持久性(因此 JPA 注释与 JDO PersistenceManager,反之亦然)。很可能,如果您有一个应用程序的一部分的 PM 和应用程序的另一部分的 EM,那么交易是分开的。

    【讨论】:

    • 理论上,如果两者都使用 JTA,则事务不应分开。但在实践中不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多