Persistência: Hibernate, JPA, JDBC e outros

3 respostas
M

Estou iniciando a implementação de um projeto Java utilizando na camada de persistência com JPA e Hibernate.
Estou com um erro que não estou conseguindo resolver. Veja se pode me dar uma ajuda.
Como disse no curso, sou iniciante em Java e vou precisar de muita ajuda.

Além da Exception que está ocorrendo, não consigo entender o porque de na console referenciar classes Entity não mapeadas no persistence.xml.

O persistence.xml foi alterado. Tenho uma desconfiança que esta alteração não foi refletida no build path do projeto.
Estou usando o Tomcat. Como faço para atualizar o build path com a nova versão do persistence.xml. Isto não deveria ser automático ?

1 - Saída da Console

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/C:/Projetos/Java/Eclipse/confeccao/WebContent/WEB-INF/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/C:/Projetos/Java/Eclipse/confeccao/WebContent/WEB-INF/lib/weld-servlet.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See <a href="http://www.slf4j.org/codes.html#multiple_bindings">http://www.slf4j.org/codes.html#multiple_bindings</a> for an explanation.

07:31:56  INFO [Version             ] Hibernate Annotations 3.5.0-CR-2

07:31:56  INFO [Environment         ] Hibernate 3.5.0-CR-2

07:31:56  INFO [Environment         ] hibernate.properties not found

07:31:56  INFO [Environment         ] Bytecode provider name : javassist

07:31:56  INFO [Environment         ] using JDK 1.4 java.sql.Timestamp handling

07:31:56  INFO [Version             ] Hibernate Commons Annotations 3.2.0-SNAPSHOT

07:31:56  INFO [Version             ] Hibernate EntityManager 3.5.0-CR-2

07:31:57  INFO [AnnotationBinder    ] Binding entity from annotated class: br.com.marcosoliveira.confeccao.financas.modelo.ContaMaior

07:31:57  INFO [EntityBinder        ] Bind entity br.com.marcosoliveira.confeccao.financas.modelo.ContaMaior on table ContaMaior

07:31:57  INFO [AnnotationBinder    ] Binding entity from annotated class: br.com.marcosoliveira.confeccao.financas.modelo.ContaProdutoBanco

07:31:57  INFO [EntityBinder        ] Bind entity br.com.marcosoliveira.confeccao.financas.modelo.ContaProdutoBanco on table ContaProdutoBanco

07:31:57  INFO [AnnotationBinder    ] Binding entity from annotated class: br.com.marcosoliveira.confeccao.financas.modelo.ChequeEspecial

Exception in thread “main” java.lang.ExceptionInInitializerError

at br.com.marcosoliveira.confeccao.teste.TestaAdicionaContaMaior.main(TestaAdicionaContaMaior.java:13)

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: modulofinanceiro] Unable to configure EntityManagerFactory

at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:372)

at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)

at br.com.marcosoliveira.confeccao.financas.Util.JPAUtil.(JPAUtil.java:19)

… 1 more

Caused by: java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass

at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:209)

at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:200)

at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1885)

at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:738)

at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:702)

at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:631)

at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:352)

at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1206)

at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1416)

at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)

at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1044)

at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:276)

at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:360)

… 5 more

2 - Arquivo Persistence.xml

<persistence-unit name="modulofinanceiro">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
   
    <class>br.com.marcosoliveira.confeccao.financas.modelo.ContaMaior</class>
   
    <properties>
   
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        <property name="hibernate.format_sql" value="true"/>
   
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/bancoconfeccao"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.peristence.jdbc.password" value=""/>
       
    </properties>
   
</persistence-unit>

3 - Implementação da Classe com Método Main

package br.com.marcosoliveira.confeccao.teste;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;
import br.com.marcosoliveira.confeccao.financas.DAO.ContaMaiorDAO;

import br.com.marcosoliveira.confeccao.financas.Util.JPAUtil;

import br.com.marcosoliveira.confeccao.financas.modelo.ContaMaior;

public class TestaAdicionaContaMaior {
public static void main(String[] args) {

EntityManager entityManager = new JPAUtil().getEntityManager();
    ContaMaiorDAO contaMaiorDAO = new ContaMaiorDAO(entityManager);
   
    ContaMaior contaMaior = new ContaMaior();
    contaMaior.setCodigoContaMaior("CF");
    contaMaior.setDescricaoContaMaior("Custo Fixo");
           
    entityManager.getTransaction().begin();
    entityManager.persist(contaMaior);
    entityManager.getTransaction().commit();
   
    System.out.println("Conta Maior gravada com sucesso");
   
    entityManager.close();
}

}

3 Respostas

starkiller

Onde vc colocou o seu persistence.xml no seu projeto? Lembrando que ele deve ficar numa pasta chamada META-INF, onde a mesma deve se encontrar no source ( src ) do seu projeto. Coloca seus modelos ai tbm ( classes anotadas ) pra gente dar uma olhada…

M

O persistence.xml está numa pasta META-INF embaixo do src. Os modelos não. Vou colocá-los no mesmo lugar.
Estou mapeando as Entities no persistence.xml uma de cada vez.

Outra dúvida que tenho é que o modelo está mapeando herança com @Inherintance(strategy=Inherintance.JOINED). Como funciona o @GeneratedValue para esta estratégia de mapeamento de herança ? Preciso anotar @GeneratedValue para as Entities filhas ?

Obrigado pelo suporte,

Marcos Vinicius

starkiller

Aqui no GUJ mesmo encontrei um tutorial do que vc quer fazer. Vc vai ter de usar a chave primaria de sua classe pai, como chave estrangeira nas classes filhas

Dá uma lida!

Criado 30 de março de 2011
Ultima resposta 30 de mar. de 2011
Respostas 3
Participantes 2