【问题标题】:Can I write to different jetty databases using JPA that is using the same "entity class"我可以使用使用相同“实体类”的 JPA 写入不同的码头数据库吗
【发布时间】:2010-06-11 08:39:46
【问题描述】:

我正在使用 Java 持久性和 EntityManager 类,并将其分配给存储应写入数据库的类对象。我的问题是我想使用相同的存储类写入不同的数据库。我的解决方案是编写一个 StorageManagerfactory,它有一个包含所有 EntityManager 的 Map。该解决方案看起来不错,直到我查看数据库并意识到所有信息(不依赖于获取正确值的 Map)都被写入同一个数据库(在 Map 中初始化的数据库之一)。

所以我的问题是: 我可以使用使用相同存储类(保存我的数据库结构的类)的 JPA 写入不同的数据库吗?

谢谢

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    是的,在persistence.xml 中定义多个持久性单元。然后,在注入 @PersistenceContext 时指定 unitName 属性。

    【讨论】:

    • 是的,这可能有效,但持久性单元是动态命名的,无法在persistance.xml 中定义。我在 perstance.xml 中定义了一个类,并喜欢用它来访问不同的数据库。
    【解决方案2】:

    我的解决方案是编写一个 StorageManagerfactory,它的 Map 包含所有 EntityManagers

    我认为MapEntityManager 不是一个好主意。

    但是,应该可以使用 Persistence.createEntityManagerFactory(String, Map) 创建 N 个 EntityManagerFactory 指向 N 个数据库(提到的工厂方法允许传递其他属性,这些属性覆盖可能已在其他地方配置的值,例如连接 url)和这些 EntityManagerFactoryMap .

    然后,只需从Map 中获取“正确的”EntityManagerFactory(使用您想要的任何键)并获取EntityManager

    【讨论】:

    • 是的,这是一个很好的解决方案,但它对我不起作用。这个解决方案意味着我必须知道所有数据库,然后将它们添加到persistance.xml 文件中。这不是我需要的解决方案,因为当我启动服务器时,它会有很多配置参数,它们可以指向以前未使用过的新数据库(这是动态完成的),因此手动添加它们是行不通的持久性.xml。谢谢你的回答
    • @Per 我不确定您是否理解我的回答,也不确定我建议检查的工厂方法在做什么。您不必在persistence.xml 文件中声明所有数据库,而只需声明一个持久性单元。然后,将新数据库“坐标”作为工厂方法的Map 中的属性传递,以覆盖现有值。这为您提供了您似乎需要的动态部分。
    • 我认为你的解决方案很有希望,我已经按照你说的实现了它,但我仍然遇到同样的问题。我看到我使用了正确的 EMF,并且输出 Begin deploying Persistence Unit XXX;状态已部署; factoryCount 2 看起来没问题,但它仍然将所有信息写入第一个出厂设置数据库(factoryCount 1)。有什么问题?
    • 你说得对。有用!!!我再次检查了我的代码,我犯了一个编码错误,这就是你建议的解决方案不起作用的原因。改完之后就完美了!谢谢你的帮助。解决方案是:在我的数据集类中设置persistance.createEntityManagerFactory(String, Map),然后获取特定的entityManagerFactory.getEntityManagerFactory(); setEntityManager(entityManagerFactory.createEntityManager(Map));在我的数据存储类中。
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2015-07-06
    • 2019-05-08
    相关资源
    最近更新 更多