[RESOLVIDO] Erro com jsf e hibernate

22 respostas
KamillaaaH

Olá! Estou programando JSF pela primeira vez e estou tendo problemas ao criar as tabelas no banco com o Hibernate.

É o seguinte, tenho a classe GeraBanco:

package exec;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class GeraBanco {
	public static void main(String[] args) {
		//TODO Auto-generate method stub
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();
		SchemaExport se = new SchemaExport(configuration);
		se.create(true,true);
	}
		
}

E o arquivo hibernate.cfg.xml:

<!DOCTYPE hibernate-configuration	PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">jdbc:mysql//localhost/teste</property>
		<property name="hibernate.connection.drive_class">com.mysql.jdbcDriver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.username"></property>
		<property name="hibernate.connection.password"></property>
		
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<property name="hibernate.c3p0.min_size">5</property>
		<property name="hibernate.c3p0.max_size">20</property>
		<property name="hibernate.c3p0.timeout">180</property>
		<property name="hibernate.c3p0.idle_test_period">100</property>
		
		<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		
		<mapping class="entidades.Aluno"/>
		<mapping class="entidades.Curso"/>
		<mapping class="entidades.Matricula"/>
	</session-factory>
</hibernate-configuration>

E tenho somente dois warnings:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

Isso acontece e quando atualizo o banco “teste” não tenho as tabelas criadas. Já procurei em vários outros tópicos, mas são erros diferentes e não somente warnings. Alguém pode ajudar?

Obrigada!

22 Respostas

neno

Faltou vc passar o caminho onde esta o seu arquivo cfg no parâmetro co configure()

assim ó!

1. package exec; 2. 3. import org.hibernate.cfg.AnnotationConfiguration; 4. import org.hibernate.tool.hbm2ddl.SchemaExport; 5. 6. public class GeraBanco { 7. public static void main(String[] args) { 8. //TODO Auto-generate method stub 9. Configuration configuration = new AnnotationConfiguration(); //instancia assim... 10. configuration.configure("pacote/hibernate.cfg.xml"); //parêmtro.. caminho do cfg 11. SchemaExport se = new SchemaExport(configuration); 12. se.create(true,true); 13. } 14. 15. }

aí é so dar um Run nessa classe individualmente, local, antes de dar um start o servidor do projeto!!

KamillaaaH

Hey, fiz como você sugeriu…
Meu arquivo hibernate.cfg.xml está em src mesmo, então não precisa especificar o caminho, certo?

Assim:

package exec;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class GeraBanco {
	public static void main(String[] args) {
		//TODO Auto-generate method stub
		Configuration configuration = new AnnotationConfiguration();
		configuration.configure("hibernate.cfg.xml");
		SchemaExport se = new SchemaExport(configuration);
		se.create(true,true);
	}
		
}

E obtive isso:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

A mesma coisa ainda… =/

Ou se eu coloco "src/hibernate.cfg.xml acontece isso:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.HibernateException: src/hibernate.cfg.xml not found
	at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:147)
	at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1329)
	at org.hibernate.cfg.Configuration.configure(Configuration.java:1351)
	at exec.GeraBanco.main(GeraBanco.java:11)
neno

Camila esse aviso que ele ta dando é porque Log4j esta tentando mostrar algum erro, mas ele não mostra porque ele não esta declarado, vc pode ativar o log4j no cfg.xml pra ver oque ele ta falando…

coloca o codigo de suas entidades aí, pode ser algum import que esteja errado…

KamillaaaH

Aí vai:

package entidades;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Aluno {
	@Id
	@GeneratedValue
	private int id;
	private String nome;
	private int idade;
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getIdade() {
		return idade;
	}
	public void setIdade(int idade) {
		this.idade = idade;
	}
	
}
package entidades;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Curso {
	@Id
	@GeneratedValue
	private int id;
	private String descricao;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}
package entidades;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Matricula {
	@Id
	@GeneratedValue
	private int id;
	@ManyToOne
	private Aluno aluno;
	@ManyToOne
	private Curso curso;
	@Temporal(TemporalType.DATE)
	private Date dataMatricula;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
	public Curso getCurso() {
		return curso;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	public Date getDataMatricula() {
		return dataMatricula;
	}
	public void setDataMatricula(Date dataMatricula) {
		this.dataMatricula = dataMatricula;
	}
}

Ah, e não tem o arquvo cfg.xml aqui…

neno

o cfg que refiro é o hibernate.cfg.xml rs, é que eu abreviei :stuck_out_tongue:

suas anotações estão ok, o seu banco mysql é sem usuario e sem senha mesmo?

... ... <property name="hibernate.connection.username"></property> <property name="hibernate.connection.password"></property> ...

KamillaaaH

Sim, sem senha…
Olha só:

Como eu ativo no hibernate.cfg.xml para mostrar os erros do log4j?

neno

então kamilah, mas ele possui um usuario, root

coloca a parte de usuario e senha do seu hibernate.cfg.xml assim

<property name="hibernate.connection.username">root</property> 
  <property name="hibernate.connection.password"></property>

e vê se funfa

KamillaaaH

Coloquei:

<property name="hibernate.connection.url">jdbc:mysql//localhost/teste</property>
		<property name="hibernate.connection.drive_class">com.mysql.jdbcDriver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>

E rodei a classe normalmente…

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

=/

neno

coloca as anotações referente as tablelas e as colunas para que o hibernate possa indentificar e cria-lás! Nas suas entidades e em cada atributo das entidades,

# import javax.persistence.TemporalType;  
   
 @Entity  
@Table
 public class Matricula {  
     @Id  
     @GeneratedValue  
     @Column//aqui e nos outros atributos...
     private int id;  

  
     @ManyToOne  
     @Column/...
     private Aluno aluno;
neno

so uma pequena correção minha

quando o atributo for de relacionamento com outra tabela ao inves de @Column, vc coloca @JoinColumn

@ManyToOne @JoinColumn private Aluno aluno;

KamillaaaH

Assim:

package entidades;
package entidades;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table
public class Matricula {
	@Id
	@GeneratedValue
	@Column
	private int id;
	@ManyToOne
	@JoinColumn
	private Aluno aluno;
	@ManyToOne
	@Column
	private Curso curso;
	@Temporal(TemporalType.DATE)
	@Column
	private Date dataMatricula;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
	public Curso getCurso() {
		return curso;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	public Date getDataMatricula() {
		return dataMatricula;
	}
	public void setDataMatricula(Date dataMatricula) {
		this.dataMatricula = dataMatricula;
	}
}
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property: entidades.Matricula.aluno
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1235)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:706)
	at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:452)
	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:268)
	at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:687)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:93)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61)
	at exec.GeraBanco.main(GeraBanco.java:12)
neno

faltou em curso…

@ManyToOne @JoinColumn private Curso curso;

todos os atributos que fazem referência a outra Entidade

KamillaaaH

Corrigindo…

Agora ficou assim:

package entidades;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table
public class Matricula {
	@Id
	@GeneratedValue
	@Column
	private int id;
	@ManyToOne
	@JoinColumn
	private Aluno aluno;
	@ManyToOne
	@JoinColumn
	private Curso curso;
	@Temporal(TemporalType.DATE)
	@Column
	private Date dataMatricula;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
	public Curso getCurso() {
		return curso;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	public Date getDataMatricula() {
		return dataMatricula;
	}
	public void setDataMatricula(Date dataMatricula) {
		this.dataMatricula = dataMatricula;
	}
}

Coloquei os @JoinColumn direitinho… Só que continua na mesma…

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

Cara, muito estranho isso… e nada de criar as tabelas no banco…

neno

bom voltou para a fase de sem erros rs…

outra coisa, o caminho url do seu banco esta completo? não esta faltando a porta do seu mysql no seu hobernate.cfg não?
geralmente a porta do mysql é 3306

<property name="hibernate.connection.url">jdbc:mysql//localhost:3306/teste</property>
neno

ah, e esta faltando outro " : " depois do mysql no endereço…

jdbc:mysql://localhost:3306/teste

KamillaaaH

Coloquei a 3306 e os dois pontos:

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/teste</property>
		<property name="hibernate.connection.drive_class">com.mysql.jdbcDriver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>

Mas ainda continua com o mesmo erro…
Como eu vejo qual porta ele está usando?

KamillaaaH

Se eu digito no browser “localhost:3306” ele não carrega… Não sei se isso ajuda =P

neno

am não sei como verificar isso… a porta 3306 é meio que padrão, em todos os lugares que utilizei o mysql era essa, mesmo em outros SO’s, nunca me preocupei nisso…

mas eu reparei outra coisa no seu hibernate.cfg…
nessa linha esta fantano o r de driver_class e um outro “.” depois de jdbc…

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

ve se mata esse mistério haha :p…

KamillaaaH

AAAAAAAHH! Deu certoooo! XDDDDDDD

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.

    alter table Matricula 
        drop 
        foreign key FKB5B91D5E94060BC3

    alter table Matricula 
        drop 
        foreign key FKB5B91D5EECE37563

    drop table if exists Aluno

    drop table if exists Curso

    drop table if exists Matricula

    create table Aluno (
        id integer not null auto_increment,
        nome varchar(255),
        idade integer,
        primary key (id)
    )

    create table Curso (
        id integer not null auto_increment,
        descricao varchar(255),
        primary key (id)
    )

    create table Matricula (
        id integer not null auto_increment,
        dataMatricula date,
        curso_id integer,
        aluno_id integer,
        primary key (id)
    )

    alter table Matricula 
        add index FKB5B91D5E94060BC3 (curso_id), 
        add constraint FKB5B91D5E94060BC3 
        foreign key (curso_id) 
        references Curso (id)

    alter table Matricula 
        add index FKB5B91D5EECE37563 (aluno_id), 
        add constraint FKB5B91D5EECE37563 
        foreign key (aluno_id) 
        references Aluno (id)

Aeewww! XD

Muito obrigada! =D
E pode deixar que vou prestar mais atenção quando estiver digitando, viu? =X

Obrigada mesmo, eu não ia conseguir sair de casa antes de resolver isso… e tô aqui morrendo de fome…
HAUIHSUahushuASHUhsuHA =P

KamillaaaH

No fim das contas o erro não tinha nada a ver com aqueles warnings, né? Haha!

neno

UFA!! Hahaha, tbm ja estava ficando frustado :stuck_out_tongue:

Bem, como vc disse, não eram erros, eram só avisos… a aplicação esta sem erros, o problema era que as tabelas não estavam sendo criadas…
resolvendo o erro do warning talvez ele mostrasse melhor aonde estava o problema, “TALVEZ” rs…

Essas escapadas de digitação são as mais dificeis de achar mesmo, tbm ja sofri com isso. :stuck_out_tongue:

Boa sorte nos estudos, prazer ter ajudado :wink:

KamillaaaH

Brigadão! x)

Criado 10 de novembro de 2010
Ultima resposta 10 de nov. de 2010
Respostas 22
Participantes 2