Criar projeto JPA sem o persistence.xml ?

1 resposta Resolvido
java
F

Criei um projeto Swing com JPA que esta funcionando bem. Agora quero retirar o arquivo persistence.xml e usar o EntityManager programaticamente. Para isso, estou tentando criar o EntityManagerFactory mas nao esta funcionando, sempre retorna nulo. Como resolver esse problema ?

Estou tentando assim.

public class JPAUtils {  
    private static EntityManagerFactory emf;
    
    /** retorna o EntityManagerFactory */
    public static EntityManagerFactory getEntityManagerFactory(){        
        if(emf == null){
            PersistenceProvider pp = new PersistenceProvider();
            Map<String, Object> properties = new HashMap<String, Object>();
            properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());                      
            properties.put(PersistenceUnitProperties.JDBC_DRIVER, "com.mysql.jdbc.Driver");
            properties.put(PersistenceUnitProperties.JDBC_URL, "jdbc:mysql://localhost:3306/iguanaauto_db?createDatabaseIfNotExist=true");
            properties.put(PersistenceUnitProperties.JDBC_USER, "root");
            properties.put(PersistenceUnitProperties.JDBC_PASSWORD, "");
            properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
            properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
            properties.put(PersistenceUnitProperties.LOGGING_LEVEL, Level.FINE);            
            emf = pp.createEntityManagerFactory("default", properties);
        }
        return emf;
    }
    
}

Aqui o GenericDAO

public class GenericDAO<T> implements IPersistence<T>{
    private EntityManager em;

    public GenericDAO() {
        em = JPAUtils.getEntityManagerFactory().createEntityManager();
    }    
    

    @Override
    public void insert(T obj) {
        try{
            em.getTransaction().begin();
            em.persist(obj);
            em.getTransaction().commit();
        }catch(PersistenceException e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de insert", JOptionPane.ERROR_MESSAGE);
        }    
    }

    @Override
    public void update(T obj) {
        try{
            em.getTransaction().begin();
            em.merge(obj);
            em.getTransaction().commit();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de update", JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public void delete(T obj) {
        try{
            em.getTransaction().begin();
            em.remove(obj);
            em.getTransaction().commit();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de delete", JOptionPane.ERROR_MESSAGE);
        }
        
    }

    @Override
    public EntityManager getSession() {
        return em;
    }
    
}

1 Resposta

F
Solucao aceita

Consegui fazer, mas pelo que pesquisei não é possível se livrar totalmente do persistence.xml, então fiz assim e está funcionando 100%.

import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.eclipse.persistence.jpa.PersistenceProvider;
import org.eclipse.persistence.config.PersistenceUnitProperties;

/**
 *
 * @author fernando
 */
public class JPAUtils {  
    private static EntityManagerFactory emf;
    private static final String PERSISTENCE_UNIT = "default"; 
    public static String IP_SERVER = "127.000.000.001";
    
    /** retorna o entitymanagerfactory */
    public static EntityManagerFactory getEntityManagerFactory(){        
        if(emf == null){
            PersistenceProvider pp = new PersistenceProvider();
            Map<String, String> properties = new HashMap<String, String>();            
            properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());                      
            properties.put(PersistenceUnitProperties.JDBC_DRIVER, "com.mysql.jdbc.Driver");
            properties.put(PersistenceUnitProperties.JDBC_URL, "jdbc:mysql://" + IP_SERVER + ":3306/iguanaauto_db?createDatabaseIfNotExist=true");
            properties.put(PersistenceUnitProperties.JDBC_USER, "root");
            properties.put(PersistenceUnitProperties.JDBC_PASSWORD, "");
            properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
            properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
            properties.put(PersistenceUnitProperties.LOGGING_LEVEL, "FINE");            
            emf = pp.createEntityManagerFactory(PERSISTENCE_UNIT, properties);
        }
        return emf;
    }
    
}

GenericDAO

public class GenericDAO<T> implements IPersistence<T>{
    private EntityManager em;

    public GenericDAO() {
        em = JPAUtils.getEntityManagerFactory().createEntityManager();
    }    
    

    @Override
    public void insert(T obj) {
        try{
            em.getTransaction().begin();
            em.persist(obj);
            em.getTransaction().commit();
        }catch(PersistenceException e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de insert", JOptionPane.ERROR_MESSAGE);
        }    
    }

    @Override
    public void update(T obj) {
        try{
            em.getTransaction().begin();
            em.merge(obj);
            em.getTransaction().commit();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de update", JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public void delete(T obj) {
        try{
            em.getTransaction().begin();
            em.remove(obj);
            em.getTransaction().commit();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Erro de delete", JOptionPane.ERROR_MESSAGE);
        }
        
    }

    @Override
    public EntityManager getSession() {
        return em;
    }
    
}

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="default">    
    <exclude-unlisted-classes>false</exclude-unlisted-classes>    
  </persistence-unit>
</persistence>
Criado 5 de setembro de 2016
Ultima resposta 6 de set. de 2016
Respostas 1
Participantes 1