【问题标题】:In JPA and Spring can a persistence unit be created on the fly?在 JPA 和 Spring 中可以动态创建持久性单元吗?
【发布时间】:2009-10-16 07:44:17
【问题描述】:

显然我们需要动态创建持久性单元。基本上,我们有这个 Web 服务和一堆具有相同域类的相同模式。我们希望能够将查询传递给上下文路径与模式匹配的 Web 服务。第一次查询服务时,传入该模式名称并动态创建持久性单元,然后每次都使用它,并在每次向服务发出请求时重复该过程已创建。

考虑到正常 PU 创建必须在启动时完成的所有构建,这是否可以使用 Spring 和 JPA?这个绝妙的想法可以扩展吗?

【问题讨论】:

  • “模式”是指“数据库模式”?您是在运行时创建它们还是预定义的?
  • 啊,我们又见面了,哈哈——预定义本质上是由不同的进程创建的

标签: hibernate spring jpa


【解决方案1】:

因此,如果您的数据库模式是预定义的,我不太明白您为什么要“动态”创建持久性单元。

唯一的例子 - 并且相当做作的例子 - 我能想到 可能 有意义的地方是,如果模式的数量相当大并且您不希望所有模式都是在您的使用寿命期间是必需的。即便如此,您所节省的只是一些内存。

所以,除非我在这里遗漏了一些东西(如果我遗漏了,请澄清您希望通过“动态”创建持久性单元来实现什么),我建议您预先定义所有持久性单位。然后,您可以通过将持久性单元名称指定为参数来创建或注入适当的 EntityManagerFactory 实例。

【讨论】:

  • 不是我的好主意,但显然我们不想在 persistence.xml 文件中写下所有必要的 PU,但我试图说服我们只需要在 xml 中写下 PU文件,然后编写额外的 EntityManagerFactoryBeans。因此,当添加新客户端时,会创建一个新模式,然后使用我们的审计 Web 服务来查询临时表,这些表将成为只读的、不可变的域对象。所以我认为我们应该使用 L2 缓存——你如何找到将 Memcached 与 Hibernate 集成的方式?
  • 不想在persistence.xml 中复制所有代码是完全可以理解的,但没有什么能阻止您做一点XSLT 魔术。关键是在构建时比在运行时容易得多。就 memcached 而言,我从未在生产环境中部署过它(一直使用 ehcache 和 jboss 缓存用于集群),但它有一个(第三方)Hibernate 提供程序(code.google.com/p/hibernate-memcached);没有理由不应该工作。
  • 另外,如果我添加了一个新模式,是否仍然可以加载新的 PU,因为它们是在不重新启动服务器的情况下增量添加的?我认为这是主要问题,不必拉下服务器来添加新的 PU,以便客户端可以查询表。
  • 啊...这将是相当有问题的。使用原始 Hibernate,您可以构建一个全新的 sessionFactory 并替换现有的 sessionFactory。对于 JPA,您正在考虑编写自己的 PersistenceProvider 来做到这一点。
  • 响应迟了,但在多租户应用程序的情况下,这是绝对有效的要求,其中每个租户将其数据存储在具有相同架构的单独数据库中,并且可以在不重新启动 webapp 的情况下即时添加这些租户数据库。
猜你喜欢
  • 2013-09-06
  • 2014-06-25
  • 2013-02-15
  • 2011-04-21
  • 2012-03-11
  • 2021-02-17
  • 2011-02-15
  • 2018-02-25
  • 2014-03-28
相关资源
最近更新 更多