Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvidas sobre utilização de métodos

Boa tarde, gostaria de saber a diferença de alguns métodos... Estou com dúvidas das consequências que cada uma teria.

1º método - caso eu queira um método que funcione para mais de uma database - caso 1

public class JPAUtil {

    public static EntityManager getEntityManager(String persistenceUnity) {

        return Persistence.createEntityManagerFactory(persistenceUnity).createEntityManager();
    }
}

2º método - caso eu queira um método que funcione para mais de uma database - caso 2

public class JPAUtil {

    public EntityManager getEntityManager(String persistenceUnity) {

        return Persistence.createEntityManagerFactory(persistenceUnity).createEntityManager();
    }
}

3º método - igual da aula - Porém tenho uma pergunta. Qual a diferença de eu por statico ou não nesse atributo?

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("financas");

    public EntityManager getEntityManager() {

        return emf.createEntityManager();
    }
}
3 respostas
solução!

Boa tarde Pedro!

Colocando o atributo entityManagerFactory como estático vai fazer com que ele pertença à Classe JPAUtil e não às instâncias que forem criadas; ou seja, vai haver apenas um EntityManagerFactory, que pode ser acessado por todos os Objetos da Classe JPAUtil.

No caso de haver mais de um banco de dados, você precisa configurar isso no arquivo *persistence.xml.

<persistence 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"
    version="2.0">

    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="financas">

        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.caelum.financas.modelo.Conta</class>

        <properties>
            <!-- Propriedades JDBC -->
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />

            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost/financas" />

            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <!-- Configurações específicas do Hibernate -->
            <property name="hibernate.dialect"
                value="org.hibernate.dialect.MySQL5InnoDBDialect" />

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

Você teria uma linha como essa:

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/nome_do_banco_de_dados" />

Para cada banco de dados.

E imagino que deveria haver vários atributos similares ao entityManagerFactory. Havendo "n" unidades de persistência, você precisaria ter "n" atributos estáticos.

Ou talvez este atributo não deva mais ser estático, pois assim sendo ele se refere à única unidade de persistência (persistence-unit), que é "financas", e aí você passaria a ter um atributo para cada instância, e cada instância da Classe JPAUtil iria se referir a uma única unidade de persistência.

Aqui seria bom alguém mais experiente discorrer um pouco sobre.

Muito obrigado pela resposta! Vou esperar mais um pouco pra ve se alguém entra mais a fundo no assunto. Mas deu pra entender bastante.

Não há de quê! :-)