Problema com annotations e Spring

25 respostas
barbafh3

Ae galera, eu fiz uma aplicação simples pra testar Spring com Hibernate Annotations, mas estou com 1 problema… quando mando salvar um objeto Aluno, ele retorna Unknown Entity hibernate.model.Aluno
sendo que a classe existe… ta ai meu applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- Instância de DriverManagerDataSource do bean sessionFactory !-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://localhost:3306/urso</value>
        </property>
        <property name="username">
            <value>root</value>
        </property>
        <property name="password">
            <value>root</value>
        </property>
    </bean>
    <!-- Instância de AnnotationSessionFactoryBean usada pelo bean genericDao !-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource"/>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>hibernate.model.Aluno</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}
                </prop>
            </props>
        </property>
    </bean>
    <!-- Instância de GenericHibernateDao !-->
    <bean id="genericDao" class="hibernate.dao.GenericHibernateDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- instância de AnnotationConfiguration !-->
    <bean id="cfg" class="org.hibernate.cfg.AnnotationConfiguration">
    </bean>
</beans>

q q tem de errado???

25 Respostas

Romulo_Fagundes

Posta como tá a classe:

hibernate.model.Aluno

Estou utilizando de forma semelhante, e não estou tendo problema…

barbafh3
package hibernate.model;


import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Entity;

@Entity
public class Aluno {
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private String codigo;
    private String nome;
    private String matricula;

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }
    
}
Romulo_Fagundes

Aluno já existe no BD?

Caso queira que ele crie, utiliza a seguinte propriedade:

...
<prop key="hibernate.hbm2ddl.auto">create
                </prop>
barbafh3

quero q ele crie sim… me explica uma coisa, colocando isso ae no appContext la, como q eu faço ele criar?

Romulo_Fagundes
<property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">${hibernate.dialect}  
                </prop>  
                <prop key="hibernate.hbm2ddl.auto">create  
                </prop>
            </props>  
</property>

No seu caso seria dessa forma…

barbafh3

tpw, vc coloka essa property la, dae qndo isntancia o sessionFactory ele cria a tabela? eu to começando a emxer com spring, to bateno cabeça dimais, isso ae é so 1 teste pra ver como q funciona

Romulo_Fagundes

…exato…depois que ele criar a tabela, ao invés de create, vc pode colocar update…

…rpz boa sorte…eu também tô apanhando um pouco…mas vale apena…o spring he show…

barbafh3

adicionei a prop q vc passou, mas n mudo nada, continua o erro, e nao crio a tabela

Romulo_Fagundes

fiquei em dúvida em relação ao seu dialect…vc recebe de algum arquivo de conf? ou tem algum properties com essas informações?

barbafh3

eu tenho 1 hibernate.properties mas n sei se ta sendo usado

barbafh3

eu dei uma lida nuns guias, alguns falar rpa usar hibernateTemplate, qual a diferença pra chamar direto o sessionFactory??

Romulo_Fagundes

vc pode utilizar uma outro esquema do spring…que seria:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>WEB-INF/jdbc.properties</value>
        </property>
    </bean>

com isso vc carrega uma properties…

dai ele tem o seguinte conteudo:

dialect=org.hibernate.dialect.PostgreSQLDialect

e vc utiliza da seguinte maneira:

<property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${dialect}
                </prop>
                <prop key="hibernate.show_sql">true
                </prop>
                <prop key="hibernate.hbm2ddl.auto">update
                </prop>
            </props>
        </property>
barbafh3

skeci de falar 1 coisa, eu to fazendo 1 app desktop hehehe eu vi ae WEB INF, axo q isso eh web ne? eu n sei nem como faz qlq coisa web hahaha to fazendo isso ae desktop

wariows
barbafh3:
package hibernate.model;


import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Entity;

@Entity
public class Aluno {
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private String codigo;
    private String nome;
    private String matricula;

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }
    
}

Importa javax.persistence.Entity e não org.hibernate.annotations.Entity

[]´s

wariows
wariows:
barbafh3:
package hibernate.model;


import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Entity;

@Entity
public class Aluno {
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private String codigo;
    private String nome;
    private String matricula;

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }
    
}

Importa javax.persistence.Entity e não org.hibernate.annotations.Entity

[]´s

Outra coisa, se vopê anota o atributo ao invés de anotar o 'get', o hibernate acessa diretamente o campo via reflection, fazendo desnecessários os 'set' e 'get'... Deste modo, você pode se preocupar em criar um modelo menos anêmico...

barbafh3

ae wariows era so o import mesmo, deu outro erro depois, ele nao aceito o codigo como String, dae mudei rpa int, e funciono certim… agora vo testa alterar, deletar e listar xD vamo v no q q da

barbafh3

tou com uma duvida, eu fiz salva, altera, deleta e buscar 1… mas n to sabendo como fazer o metodo pra buscar todos… como q da pra faze isso?
pq get e load so retornam object e nao list…

wariows

barbafh3:
tou com uma duvida, eu fiz salva, altera, deleta e buscar 1… mas n to sabendo como fazer o metodo pra buscar todos… como q da pra faze isso?
pq get e load so retornam object e nao list…

tá usando a Session do hibernate ou o EntityManager?

barbafh3

to usando o session q defini no appContext

wariows

faz:

Criteria criteria = session.createCriteria(Aluno.class);
List alunos = criteria.list();
barbafh3

tipo eu to tentando fazer um dao generico, intaum como eu faço pra dexar a classe do criteria em aberto, recebendo ela como parametro ou algo assim?

wariows

recebe no construtor…

private Class<?> objClass;


public GenericDAO(Class<?> objClass) {
    this.objClass = objClass;
}

public List list() {
   Criteria criteria = session.createCriteria(this.objClass);
   return criteria.list();
}

Dai vc cria um AlunoDAO assim:

public class AlunoDAO extends GenericDAO<.....> {

public AlunoDAO() {
   super(Aluno.class);
}

}

[]´s

barbafh3

v se assim funciona:

public List listAll(Class classe) {
        Session session = this.getSession();
        Criteria criteria = session.createCriteria(classe);
        List lista = criteria.list();
        return lista;
    }

e chamo o metodo assim:

List<Aluno> alunos = genDao.listAll(Aluno.class);
wariows

sim

barbafh3

blz intaum wariows, tu me ajudo pacas, vlwwwwwwwwwwww xD

Criado 23 de setembro de 2008
Ultima resposta 24 de set. de 2008
Respostas 25
Participantes 3