Como configurar Data Source JNDI em um Servidor Jersey JaxRS com Hibernate e JPA

Gostaria de saber Como configurar Data Source JNDI em um Servidor Jersey JaxRS com Hibernate e JPA.

Meu Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>

   <persistence-unit name="persistence_unit_meudb" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
         <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/meudb"/>
         <property name="javax.persistence.jdbc.user" value="root"/>
         <property name="javax.persistence.jdbc.password" value="root"/>
         <property name="hibernate.show_sql" value="true"/>
         <property name="hibernate.format_sql" value="true"/>

         <property name="hibernate.hbm2ddl.auto" value="update"/>
      </properties>
   </persistence-unit>
</persistence>

Meu Web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>br.com.app.controlador</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
  </servlet-mapping>
</web-app>

Meu POM.XML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.APP</groupId>
  <artifactId>APP</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>APP Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <repositories>
  	<repository>
    	<id>snapshot-repository.java.net</id>
    	<name>Java.net Snapshot Repository for Maven</name>
    	<url>https://maven.java.net/content/repositories/snapshots/</url>
    	<layout>default</layout>
	</repository>  
  </repositories>
 
  <properties>
    <jersey.version>2.22.1</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>
 
  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
  </dependencyManagement>
 
  <dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.4</version>
    </dependency>
    
    <dependency> 
    	<groupId>org.slf4j</groupId>
    	 <artifactId>slf4j-api</artifactId>
    	 <version>1.5.6</version> 
   	  </dependency> 
 
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-jsp</artifactId>
    </dependency>
 
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
 
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
    </dependency>
 
 
 	<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.glassfish.grizzly/grizzly-http-server -->
<dependency>
    <groupId>org.glassfish.grizzly</groupId>
    <artifactId>grizzly-http-server</artifactId>
    <version>2.4.2</version>
</dependency>


    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>
 
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
    </dependency>
 
	<dependency>
   		<groupId>org.hibernate</groupId>
   		<artifactId>hibernate-core</artifactId>
   		<version>5.1.0.Final</version>
	</dependency>
 
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>5.1.0.Final</version>
	</dependency>
	
	<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.5.6</version>
</dependency>
 
 
    <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
    </dependency>
 
  </dependencies>
  <build>
    <finalName>APP</finalName>
    <plugins>
	       <plugin>
	           <artifactId>maven-compiler-plugin</artifactId>
	           <configuration>
	               <source>1.8</source>
	               <target>1.8</target>
	           </configuration>
	       </plugin>
	   </plugins>    
  </build>
</project>

Meu Singleton:
public class EntityManagerSingleton {

private final EntityManagerFactory entityManagerFactory;

private final EntityManager entityManager;

public EntityManagerSingleton() {
	this.entityManagerFactory = Persistence.createEntityManagerFactory("persistence_unit_meudb");
	this.entityManager = this.entityManagerFactory.createEntityManager();
}

public EntityManagerFactory getFactory() {
	return entityManagerFactory;
}

public EntityManager getInstance() {
	return entityManager;
}

public void fechar() {
	if(this.entityManager.isOpen())
		this.entityManager.close();
	if(this.entityManagerFactory.isOpen())
		this.entityManagerFactory.close();
}

}

Exemplo do Controller:

	private final EntityManagerSingleton singleton = new EntityManagerSingleton();
private final FechamentoDAO fechamentoDAO = new FechamentoDAO(singleton.getFactory(), singleton.getInstance());
private final FechamentoDetalheDAO detalheDAO = new FechamentoDetalheDAO(singleton.getFactory(), singleton.getInstance());

@GET
@Produces("application/json; charset=UTF-8")
@Path("/mensal/rateio/{id}")
public List<ControleContas> listarControleContasFechamentoMensalCondominioPorNrseq(@PathParam("id") int id) {
	List<ControleContas> contas = new ArrayList<ControleContas>();
	List<ControleContas> listaDeContas;
	try {
		listaDeContas = detalheDAO.listarControleContasFechamentoMensalCondominioPorNrseq(id);
		if(listaDeContas != null) {	
			System.err.println("Não Nullo");
			for(ControleContas entidade : listaDeContas) {
				contas.add(pegaControleContas(entidade));
			}
			detalheDAO.fechar();
			fechamentoDAO.fechar();
			System.err.println("Nha " + contas.size());
			return contas;
		} else {
			System.err.println("Nullo");
			detalheDAO.fechar();
			fechamentoDAO.fechar();
			return new ArrayList<ControleContas>();
		}
	
		
	} catch (Exception e) {
		System.err.println(smartjava.getFullStackTrace(e));
		detalheDAO.fechar();
		fechamentoDAO.fechar();
		return new ArrayList<ControleContas>();
	}
}

Função chamada no DAO:

	private final EntityManagerFactory entityManagerFactory;

private final EntityManager entityManager;

SmartJava sj = new SmartJava();

public FechamentoDetalheDAO() {
	this.entityManagerFactory = Persistence.createEntityManagerFactory("persistence_unit_meudb");
	this.entityManager = this.entityManagerFactory.createEntityManager();
}


public FechamentoDetalheDAO(EntityManagerFactory factory, EntityManager instance) {
	this.entityManagerFactory = factory;
	this.entityManager = instance;
}

@SuppressWarnings("unchecked")
public List<ControleContas> listarControleContasFechamentoMensalCondominioPorNrseq(int fechamentonrseq) {
	try {
		System.err.println(fechamentonrseq);
		return this.entityManager.createQuery("SELECT a.conta FROM FechamentoDetalhe a "
				+ "WHERE a.fechamento.nrseq = :fechamento AND a.ativo = 1 ORDER BY a.bloco, a.apartamento")
				.setParameter("fechamento", fechamentonrseq).getResultList();
	} catch (Exception e) {
		return null;
	}
	
}

Como num servidor normal, visto que o JAX não interfere nisso, não é?

Como configurar no Tomcat 7, vi alguns tutoriais, entendi o conceito mas não entendi em como aplicar em um servidor que contém Hibernate

Precisa criar um arquivo context.xml e configurar o web.xml para usar.
Tutorial

Quando tento passar o DataSource para o Singleton, me ocorre o erro abaixo:

org.apache.tomcat.dbcp.dbcp2.BasicDataSource cannot be cast to javax.persistence.EntityManagerFactory

Singleton editado:

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
public class EntityManagerSingleton {

    @PersistenceUnit(name="jdbc/dbsouvizinho", unitName="persistence_unit_souvizinho") private EntityManagerFactory entityManagerFactory;
    @PersistenceContext(name="jdbc/dbsouvizinho", unitName="persistence_unit_souvizinho") private EntityManager entityManager;

    public EntityManagerSingleton() {


        try {
            entityManagerFactory = (EntityManagerFactory) new InitialContext().lookup("java:comp/env/jdbc/dbsouvizinho");
            entityManager = (EntityManager) new InitialContext().lookup("java:comp/env/jdbc/dbsouvizinho");
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
public EntityManagerFactory getFactory() {
        return entityManagerFactory;
    }

    public EntityManager getInstance() {
        return entityManager;
    }

Simples, você está tentando transformar uma coisa em outra e isso não é permitido.
Reveja o tutorial/livro/apostila que ensina a fazer isso e corrija o que estiver errado.

Eu tinha visto em outros lugares o cara fazer isso, na documentação não tem como converter a conexão criada pelo JDNI para EntityManager