代码之家  ›  专栏  ›  技术社区  ›  Vinnie

如何在persistence.xml中“参数化”JPA数据库实例?

  •  5
  • Vinnie  · 技术社区  · 15 年前

    我有一个利用JPA的Java Web应用程序。数据库实例是在 persistence.xml 使用文件 jta-data-source 标签。

    我想在同一个(glassfish)服务器上部署Web应用程序的第二个副本,但指向了不同的数据库实例。

    实现这一目标的最佳方法是什么?理想情况下,我想 坚持XML 在战争之外覆盖文件(在类路径的某个地方?).我不知道该把它放在哪里,也不知道如何用一种它不会与我的另一个实例相关联的方式来定义它。我可以看到我们以这种方式托管少数实例(SaaS),我希望配置不在部署的战争中,这样它就不会成为维护问题。出于安全原因,不能在客户端之间共享数据库实例。

    我相信这对我们小组来说不是一个独特的问题。其他人用来解决这个问题的最佳实践或解决方案是什么?

    6 回复  |  直到 13 年前
        1
  •  1
  •   Michael Pralow    15 年前

    我想你也已经在其他方面修改了副本了?(例如,EAR文件的名称)

    如果您使用诸如Ant或Maven这样的构建软件,您可以在persistence.xml中使用一个占位符,并通过使用不同的构建参数创建不同的“副本”。

    用Maven

    mvn干净安装-dmydatabasename=db/somedb

        2
  •  2
  •   john sanders    15 年前

    更新:

    http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html

    不确定是否可以在AppServer中设置,但我会试试的。唯一让我担心的是范围管理。容器沿事务边界管理范围

    //inject entity manager
    @Inject("mySpecialEntityManager")
    EntityManager em;
    
    //then mark the actual factory method in the factory bean with    
    @Produces("mySpecialEntityManager")
    

    但是如何管理范围才是问题所在


    2.2.2.自举

    JPA规范定义了一个引导过程来访问EntityManagerFactory和EntityManager。引导程序类是javax.persistence.persistence,例如

    map configOverrides=new hashmap();

    configoverrides.put(“hibernate.hbm2ddl.auto”,“create drop”);

    EntityManagerFactory程序化=

    Persistence.createEntityManagerFactory("manager1", configOverrides);
    

    第一个版本相当于第二个版本中的空映射。映射版本是一组覆盖,它将优先于persistence.xml文件中定义的任何属性。第2.2.1节“打包”中定义的所有属性都可以传递给CreateEntityManagerFactory方法,并且还有一些其他属性:

    *
    
      javax.persistence.provider to define the provider class used
    *
    
      javax.persistence.transactionType to define the transaction type used (either JTA or RESOURCE_LOCAL)
    *
    
      javax.persistence.jtaDataSource to define the JTA datasource name in JNDI
    *
    
      javax.persistence.nonJtaDataSource to define the non JTA datasource name in JNDI
    *
    
      javax.persistence.lock.timeout pessimistic lock timeout in milliseconds (Integer or String)
    *
    
      javax.persistence.query.timeout query timeout in milliseconds (Integer or String)
    *
    
      javax.persistence.sharedCache.mode corresponds to the share-cache-mode element defined in Section 2.2.1, “Packaging”.
    
        3
  •  1
  •   Pascal Thivent    15 年前

    我将打包两个版本的webapp并在 jta-data-source 各自的要素 persistence.xml (我认为你不能将这个文件具体化,它应该在 WEB-INF/classes/META-INF/persistence.xml )

        4
  •  1
  •   Frank Klomp    14 年前

    将persistence.xml存储在 classes 目录,然后在类路径中首先指定该文件夹?

        5
  •  0
  •   Community Mohan Dere    8 年前

    通过Spring,您可以在应用程序启动时覆盖persistence.xml设置,并从外部化的属性文件加载这些设置。

    http://www.summa-tech.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring/

    看看@darren的答案: Spring + Hibernate + JPA

        6
  •  0
  •   David I.    13 年前

    以下是我在Java SE环境中所能做的:

    创建一个不带 persistence.xml 文件。我创造了一个 manifest.mf 手动和在 Class-Path: 除了我需要的其他条目外,我还添加了“.”。

    在安装软件的目录中,创建一个 META-INF 目录和放置 坚持XML 在那里。它应该能自动被拾起。

    例如

      /my/install/dir/
                     META-INF/persistence.xml
                     foo.jar