我正在尝试将同一实体持久保存到 MySQL 和 Postgres 数据库(这主要是为了识别任何不一致之处,并找出执行双写的任何问题的细节——我在这里遇到过)。我发现的文章都描述了依赖于其他框架的解决方案。我正在尝试使用开箱即用的 Glassfish 4.0、JPA 2.1 和 EclipseLink 2.5 作为 JPA 提供程序来解决这个问题。我正在使用 Eclipse,并意识到 IDE 不支持在 persistence.xml 文件中配置多个持久性单元,因此我直接为此编写了 XML。
我期待在代码中做这样的事情(用同样的方法):
@PersistenceContext(name = "MyAppMySQLPU")
EntityManager emMySQL;
@PersistenceContext(name = "MyAppPostgresPU")
EntityManager emPostgres;
//...etc...
MyThing thing = new MyThing();
//...etc...
emMySQL.persist(thing);
emPostgres.persist(thing);
并使用persistence.xml
包含以下内容的文件:
<persistence-unit name="MyAppPostgresPU">
<jta-data-source>jdbc/PostgresPool_test</jta-data-source>
<class>model.MyThing</class>
</persistence-unit>
<persistence-unit name="MyAppMySQLPU">
<jta-data-source>jdbc/MySQLPool_test</jta-data-source>
<class>model.MyThing</class>
</persistence-unit>
当我这样做时,我收到以下错误:
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
SEVERE: Exception while preparing the app
SEVERE: Exception while preparing the app : Could not resolve a persistence unit corresponding to the persistence-context-ref-name [MyAppPostgresPU] in the scope of the module called [MyApp]. Please verify your application.
但是,如果我只包含其中一个<persistence-unit>
短语(不管是哪个短语),实体就会被持久化到关联的数据库中——我只是不知道如何让它同时与这两个短语一起工作(没有在其他框架中利用持久性功能)。