首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖JPA持久性单元

覆盖JPA持久性单元
EN

Stack Overflow用户
提问于 2017-03-07 20:50:11
回答 3查看 1.8K关注 0票数 0

我的jar文件中有一个空的persistenceUnit:

代码语言:javascript
复制
 <persistence-unit transaction-type="JTA" name="base1">
    </persistence-unit>

    <persistence-unit transaction-type="JTA" name="base2">
    </persistence-unit>

我的想法是在我的主项目中用带有属性和类的完整persistenceUnit替换空persistenceUnit,如下所示:

代码语言:javascript
复制
<persistence-unit name="base1" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:jboss/datasources/myDS</jta-data-source>
        <class>br.com.myproject.MyClass</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="hibernate.cache.use_second_level_cache"
                      value="false" />
        </properties>
    </persistence-unit>

但是当我尝试启动服务器时,我得到了以下错误:

代码语言:javascript
复制
 Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYJPA0038: Falha ao adicionar o serviço da unidade de persistência para base1
    Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.persistenceunit.myproject#base1.__FIRST_PHASE__ is already registered"}}

有什么方法可以覆盖persistenceUnit吗?

EN

回答 3

Stack Overflow用户

发布于 2017-03-08 00:08:02

如果您确实需要动态覆盖您的persistence.xml,最好在构建过程中完成。

我个人的警告:这听起来像是一种配置--对我来说是地狱,我建议在这里使用容器管理的JNDI方法。

但不管怎样:使用2个maven配置文件。如果您激活了profile1,那么来自profile1的persistence.xml将被添加到正确的位置。如果你激活了profile2,来自profile2的persistence.xml将被占用。

因此,对maven使用copy-resources-mojo。https://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html

如果只是参数的值改变了,而不是整个结构改变了,那么你也可以在maven过程中只“过滤”和替换字符串,然后你可以在概要文件中定义属性。https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

您还可以将基本persistence.xml作为默认文件添加到项目中。因此,如果没有激活maven-profile,将使用此配置文件。(即使可能发生这种情况,如果数据资源配置不正确,应用程序也不会按预期工作)

票数 0
EN

Stack Overflow用户

发布于 2017-03-17 02:32:05

Spring提供了一个接口JpaVendorAdapter,它允许在应用程序启动时通过Spring Java config或XML配置插入任何特定于JPA供应商的配置。

您可以使用LocalContainerEntityManagerFactoryBean以及HibernateJpaVendorAdapter、EclipseLinkJpaVendorAdapter或OpenJpaVendorAdapter等任何JpaVendorAdapter实现类来创建EntityManagerFactory实例。

我相信如果您的应用程序使用Spring,您甚至不需要在persistence.xml中定义空的持久化单元。

下面是如何使用Spring Java配置创建EntityManagerFactory的示例:

代码语言:javascript
复制
    @Inject 
    private DataSource base1DataSource;

    @Inject 
    private DataSource base2DataSource;

    @Bean
    public EntityManagerFactory base1EntityManagerFactory()
            throws IOException, NamingException {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        LocalContainerEntityManagerFactoryBean containerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        containerEntityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        containerEntityManagerFactoryBean.setPackagesToScan("YOUR_PACKAGE_NAMES");
        containerEntityManagerFactoryBean.setJtaDataSource(base1DataSource);
        containerEntityManagerFactoryBean.setJpaProperties(loadBase1JpaProperties());
        containerEntityManagerFactoryBean.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
        containerEntityManagerFactoryBean.setPersistenceUnitName("base1");
        containerEntityManagerFactoryBean.afterPropertiesSet();

        return containerEntityManagerFactoryBean.getObject();
    }

    @Bean
    public EntityManagerFactory base2EntityManagerFactory()
            throws IOException, NamingException {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        LocalContainerEntityManagerFactoryBean containerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        containerEntityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        containerEntityManagerFactoryBean.setPackagesToScan("YOUR_PACKAGE_NAMES");
        containerEntityManagerFactoryBean.setJtaDataSource(base2DataSource);
        containerEntityManagerFactoryBean.setJpaProperties(loadBase2JpaProperties());
        containerEntityManagerFactoryBean.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
        containerEntityManagerFactoryBean.setPersistenceUnitName("base2");
        containerEntityManagerFactoryBean.afterPropertiesSet();

        return containerEntityManagerFactoryBean.getObject();
    }

    @Bean
    public Properties loadBase1JpaProperties() throws IOException {
        ClassPathResource resource = new ClassPathResource("base1-persistence.properties");

        return PropertiesLoaderUtils.loadProperties(resource);
    }

    @Bean
    public Properties loadBase2JpaProperties() throws IOException {
        ClassPathResource resource = new ClassPathResource("base2-persistence.properties");

        return PropertiesLoaderUtils.loadProperties(resource);
    }

有关可以覆盖到persistence.xml的内容的其他信息,请参阅以下网址:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.html

票数 0
EN

Stack Overflow用户

发布于 2017-03-17 02:48:34

我假设你想在一个超类中声明你的持久化单元,并且你想在一个显式的项目中定义持久化单元。如果是真的,你可以使用如下的JNDI方法:

代码语言:javascript
复制
<persistence-unit name="MyPersistenceUnit"
    transaction-type="JTA">

    <jta-data-source>java:/myDS</jta-data-source>

    <mapping-file>META-INF/orm.xml</mapping-file>


    <jar-file>Persistence.jar</jar-file>

    <properties>

        <property name="jboss.entity.manager.jndi.name" value="java:app/applicationEntitymanager"/>  
        <!-- Properties for Hibernate -->
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <property name="hibernate.show_sql" value="false" />
    </properties>

</persistence-unit>

在另一端,您可以使用以下命令访问Entitymanager:

代码语言:javascript
复制
@Resource(mappedName = "java:app/applicationEntitymanager")
protected EntityManager em;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42648794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档