Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple persistence units in Wildfly?

Is it possible to have two persistence units in a Wildfly (9.0.2) application?

I get "WFLYJPA0061: Persistence unitName was not specified and there are 2 persistence unit definitions in application deployment deployment "jasper-web.war". Either change the application deployment to have only one persistence unit definition or specify the unitName for each reference to a persistence unit."

I have unitName specified in the @PeristenceContext annotations. I read somewhere I could disable

<!--
<subsystem xmlns="urn:jboss:domain:jpa:1.1">
    <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/>
</subsystem>
-->

in standalone.xml. This removed the error message, but also disabled injection of entityManagers (null pointer referencing them in code)

I have tried to split the persistence units over two different ejb-jars, each with their own persistence.xml, but as they're still included in the same war, Wildfly still complains.

The the two persistence units are used with hibernate, one with a postgresql database and one with a ucanaccess driver for ms access. They both work separately.

like image 441
jon martin solaas Avatar asked Feb 07 '16 20:02

jon martin solaas


People also ask

Can we have multiple persistence XML?

The Java Persistence API allows you to define multiple persistence units, each of which can map to a separate database.

What is persistence unit in persistence XML?

A persistence unit defines the details that are required when you acquire an entity manager. To package your EclipseLink JPA application, you must configure the persistence unit during the creation of the persistence. xml file. Define each persistence unit in a persistence-unit element in the persistence.

What is persistent Unit Name?

A persistence unit defines a set of all entity classes that are managed by EntityManager instances in an application. This set of entity classes represents the data contained within a single data store. This file defines a persistence unit named OrderManagement, which uses a JTA-aware data source: jdbc/MyOrderDB.

How does persistence XML work?

The persistence. xml file must define a persistence-unit with a unique name in the current scoped classloader. The provider attribute specifies the underlying implementation of the JPA EntityManager. In JBoss AS, the default and only supported / recommended JPA provider is Hibernate.


1 Answers

here an example of what works in our wildfly 8.x/9.x ejb app:

First of all define all the classes for each persistence-unit in the persistence.xml, unlisted classes can be turned off to disable autodiscovery.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
   <persistence-unit name="primary">
      <jta-data-source>java:jboss/datasources/primary_ds</jta-data-source>
      <class>whatever.primary.model.SomeEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>

   <persistence-unit name="secondary">
      <jta-data-source>java:jboss/datasources/secondary_ds</jta-data-source>
      <class>whatever.secondary.model.AnotherEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>
</persistence>

If you use JBoss Developer Studio ignore the warning (it is only an eclipse flaw):

Multiple persistence units defined - only the first persistence unit will be recognized

Resources.java

package whatever.util;

import javax.annotation.Resource;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

public class Resources {

    @Produces
    @PersistenceContext(unitName = "primary")
    private EntityManager emPrimary;

    @Produces
    @PersistenceContext(unitName = "secondary")
    private EntityManager emSecondary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/primary_ds")
    private DataSource dsPrimary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/secondary_ds")
    private DataSource dsSecodnary;

}

Dao primary example

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoPrimaryExample {

    @PersistenceContext(unitName = "primary")
    private EntityManager em;

    public void create(SomeEntity entity) {
        em.persist(entity);
    }
}

Dao secondary example

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoSecondaryExample {

    @PersistenceContext(unitName = "secondary")
    private EntityManager em;

    public void create(AnotherEntity entity) {
        em.persist(entity);
    }
}

IMPORTANT: If you plan to use booth persistence units in same transaction than XA datasources should be used.

like image 80
fabe Avatar answered Sep 16 '22 12:09

fabe