0
votes

Error inserting second datasource with GenericDAO

I'm trying to insert a second base in persistence.xml. I have already configured the datasource in jboss and tested it. When inserting a second persistence-unit in xml and attempting to raise jboss the error below occurs. I tried to set in each DAO class @PersistenceContext(unitName = "unit-name") and @PersistenceUnit, but to no avail. I tried to follow some tutorials, but I did not understand how to fit step by step in my context, nor do I know if this is the case.

I want to know how to configure for my case, I think the biggest difference is that I have an EntityManager coming from a GenericDAO and this is making it difficult for me to understand. If I have to annotate something else in DAOs or entities, what if I have to create another abstract class?

Erro:

The persistent unitName has not been specified and there are persistent drive definitions 2 in the deployment of the deployment application "intranet.war". You can either change the deployment of the application to only have one definition of the persistence unit or specify the unitName for each reference of a persistence unit.

17: 37: 11,411 INFO [org.wildfly.extension.undertow] (MSC service thread 1-8) WFLYUT0006: Undertow HTTP listener default listening on 127.0.0.1:8080
17: 37: 11,491 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) WFLYJCA0001: Data source limit [java: jboss / datasources / ExampleDS]
17: 37: 11,492 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) WFLYJCA0001: Data source limit [java: jboss / datasources / intraDS]
17: 37: 11,491 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-8) WFLYJCA0001: Data source limit [java: jboss / datasources / intrasis]
17: 37: 11,524 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-4) WFLYDS0013: The FileSystemDeploymentService has been started for the directory C: \ Users \ vinicius.cipolli \ Devlopment \ jboss-eap -7.0 \ standalone \ deployments
17: 37: 11,528 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: c "intranet.war" (runtime-name: "intranet.war")
17: 37: 11,621 INFO [org.infinfin.factories.GlobalComponentRegistry] (MSC service thread 1-8) ISPN000128: Infinispan version: Infinispan 'Mahou' 8.1.2.Final-redhat-1
JBWS022052: Starting JBossWS 5.1.3.SP1-redhat-1 (Apache CXF 3.1.4.redhat-1) 17:37:11,661 INFO [org.jboss.ws.common.management] (MSC service thread 1-6)
17: 37: 12,706 INFO [org.jboss.as.jpa] (MSC service thread 1-5) WFLYJPA0002: Read the persistence.xml for intranet
17: 37: 12,707 INFO [org.jboss.as.jpa] (MSC service thread 1-5) WFLYJPA0002: Read the persistence.xml for intrasis
17: 37: 12,708 WARN [org.jboss.as.ee] (MSC service thread 1-5) WFLYEE0065: Invalid signature for method init annotated with javax.annotation.PostConstruct in br.sp.corpedu.intranet.domain .acod.service.EspecialityService class. The signature must be 'void methodName (InvocationContext ctx)'
17: 37: 12,709 WARN [org.jboss.as.ee] (MSC service thread 1-5) WFLYEE0065: Invalid signature for method init annotated with javax.annotation.PostConstruct in br.sp.corpedu.intranet.expose .resources.CourseResource class. The signature must be 'void methodName (InvocationContext ctx)'
17: 37: 12,709 WARN [org.jboss.as.ee] (MSC service thread 1-5) WFLYEE0065: Invalid signature for method init annotated with javax.annotation.PostConstruct in br.sp.corpedu.intranet.expose .resources.ResourceSpeciality of the class. The signature must be 'void methodName (InvocationContext ctx)'
17: 37: 12,709 WARN [org.jboss.as.ee] (MSC service thread 1-5) WFLYEE0065: Invalid signature for method init annotated with javax.annotation.PostConstruct in br.sp.corpedu.intranet.expose .resources.esto.ItemResource of the class. The signature must be 'void methodName (InvocationContext ctx)'
17: 37: 12,719 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit. "Intranet.war" .DEPENDENCIES: org.jboss.msc .service.StartException in service jboss.deployment.unit. "intranet.war" .DEPENDENCIES: WFLYSRV0153: Failed to process DEPENDENCIES phase of deployment "intranet.war"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start (DeploymentUnitPhaseService.java:154)
    at org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService (ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl $ StartTask.run (ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624)
    at java.lang.Thread.run (Thread.java:748)
Caused by: java.lang.IllegalArgumentException: WFLYJPA0061: The persistent unitName has not been specified and there are persistent drive definitions 2 in the deployment of the deployment application "intranet.war". You can either change the deployment of the application to only have one definition of the persistence unit or specify the unitName for each reference of the persistence unit.
    at org.jboss.as.jpa.container.PersistenceUnitSearch.ambiguousPUError (PersistenceUnitSearch.java:187)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.findWithinDeployment (PersistenceUnitSearch.java:153)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.findPersistenceUnitSupplier (PersistenceUnitSearch.java:75)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.resolvePersistenceUnitSupplier (PersistenceUnitSearch.java:64)
    at org.jboss.as.jpa.processor.JPAAnnotationProcessor.getPersistenceUnit (JPAAnnotationProcessor.java:372)
    at org.jboss.as.jpa.processor.JPAAnnotationProcessor.getBindingSource (JPAAnnotationProcessor.java:296)
    at org.jboss.as.jpa.processor.JPAAnnotationProcessor.processField (JPAAnnotationProcessor.java:171)
    at org.jboss.as.jpa.processor.JPAAnnotationProcessor.processPersistenceAnnotations (JPAAnnotationProcessor.java:138)
    at org.jboss.as.jpa.processor.JPAAnnotationProcessor.deploy (JPAAnnotationProcessor.java:100)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start (DeploymentUnitPhaseService.java:147)
        ... more
    
 

    17:37:12:17 ERROR [org.jboss.as.controller.management-operation]
     (Controller Boot Thread) WFLYCTL0013: Deploy Failure -
     address ([("deployment" = "intranet.war"])) - failure to describe:
     {"WFLYCTL0080: Service Failure" =
     {"jboss.deployment.unit. \" intranet.war \ "DEPENDENCIES" =
     "org.jboss.msc.service.StartException in service
     jboss.deployment.unit. \ "intranet.war \" DEPENDENCIES: WFLYSRV0153:
     Failed to process DEPENDENCIES phase of deployment \ "intranet.war \"
         Caused by: java.lang.IllegalArgumentException: WFLYJPA0061: The persisted unitName has not been specified and there are
    Persistent Drive 2 in Deployment Deployment
    \ "intranet.war \". You can either change the application deployment
    to have only one
    specify the unit for each reference of a unit of
    persistence. "}} 17: 37: 12,752 INFO [org.jboss.as.server]` enter code here`
    (ServerService Thread Pool - 34) WFLYSRV0010: Deployed
    "intranet.war" (runtime-name: "intranet.war")

The persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
   xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
   <persistence-unit name="intranet" transaction-type="JTA">
      <jta-data-source>java:jboss/datasources/intraDS</jta-data-source>

      <properties>
         <!-- Properties for Hibernate -->
         <property name="hibernate.hbm2ddl.auto" value="none" />
         <property name="hibernate.show_sql" value="false" />
         <property name="hibernate.format_sql" value="false" />
      </properties>
   </persistence-unit>

   <persistence-unit name="intrasis" transaction-type="JTA">
      <jta-data-source>java:jboss/datasources/intrasis</jta-data-source>

      <properties>
         <property name="hibernate.hbm2ddl.auto" value="none" />
         <property name="hibernate.show_sql" value="false" />
         <property name="hibernate.format_sql" value="false" />
      </properties>
   </persistence-unit>
</persistence>

The GenericDAO class

public abstract class GenericDAO<T> implements Serializable {
    private static final long serialVersionUID = -4843781544193464186L;

    private static Logger logger = LogManager.getLogger(GenericDAO.class);

    protected Class<T> classe;

    @PersistenceContext
    protected transient EntityManager entityManager;


    protected GenericDAO(final Class<T> classe) {
        this.classe = classe;
    }

    public T save(final T entity) {
        try {
            entityManager.persist(entity);
            entityManager.flush();

        } catch (Exception e) {
            logger.error("Falha ao persistir a entidade: " + entity.toString(), e);
            throw TypeApplicationException.PERSISTENCIA.buildException("Ocorreu uma falha na persistencia");
        }

        return entity;
    }

the class itemDAO that should use the base intrasis. In it I tried to use @PersistenceContext (unitName = "intrasis")

public class ItemDAO extends GenericDAO<Item> {

    private static final long serialVersionUID = 1L;

    @PersistenceContext(unitName="intrasis")
    protected transient EntityManager entityManager;

    protected ItemDAO() {
        super(Item.class);
    }



}

another class that uses the other bank and tbm I tried the PersistenceContext for the other bank.

public class CursoDAO extends GenericDAO<Curso> {
    private static final long serialVersionUID = 5659645428769766934L;

    @PersistenceContext(unitName="intranet")
    protected transient EntityManager entityManager;

    protected CursoDAO() {
        super(Curso.class);
    }

    public List<Curso> buscarTodos() {
        String jpql = "SELECT e FROM Curso e";

        TypedQuery<Curso> typedQuery = entityManager.createQuery(jpql, Curso.class);
        return typedQuery.getResultList();
    }
1
In abstract GenericDAO persistence context reference is not specified by name, maybe that is the point?Alex Salauyou
Alex, I think I understand your point, and maybe that's the way. I do not define the unitName in GenericDAO because I have 2 contexts (datasources). I think that's the question.cpll
I think you should try to inject only in concrete implementations. In generic DAO you may add a protected abstract method like getPersistenceContext, to obtain an entity manager which is injected in concrete implementation.Alex Salauyou

1 Answers

1
votes

1) You have probably an injection point where you don't specify the unit name. If it is not the case try adding this line to your persistence.xml :

<property name="wildfly.jpa.default-unit" value="true"/>

2) In your GenericDAO do not use:

@PersistenceContext
protected transient EntityManager entityManager;

try passing the entity manager througth constructor.