Duvida Hibernate

14 respostas
brucsantos

Boa tarde!
Estou fazendo uma aplicação usando o hibernate com annotations com postgree.
Duvida:

Quando tenho um o codigo a baixo:

@Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="identity") private int identity;

É necessario ter uma sequencia ja criada no meu banco?
Se sim, tem como o hibernate criar uma sequencia ou tabelas no banco?

Quem puder me ajudar, agradeço!

14 Respostas

S

Que eu saiba não precisa de uma sequencia criada, mas para gerar o banco existe um jeito via código mais fácil que é o seguinte:

AnnotationConfiguration config = new AnnotatioConfiguration();
        config.configure();
        SchemaExport schema = new SchemaExport(config);
        schema.create(true,true);

Esse código vai gerar tudo que o Hibernate reconhecer, exceto o banco em si, porém tabelas, etc. tudo será criado.

brucsantos

Ow muito legal! valeu pela dica samuelm7.

So que to com um outro probleminha! rsrsrs

Quando vou fazer o insert no banco ele me da o sequinte erro quando executo o dodigo:

session.beginTransaction().commit();
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

e no console aparece:

Hibernate: 
    insert 
    into
        User
        (userName, identity) 
    values
        (?, ?)

oq que parece e que ele não tah conseguindo pegar o valor dos campos.

Minha classe:

@Entity
@Table(name="User")
@SequenceGenerator(name="psgseq_user", sequenceName="psgseq_user")
public class User implements Serializable {
	

	private static final long serialVersionUID = -1060135636312050602L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO, generator="psgseq_user")	
	private int identity;
	
	
	private String userName;


	@Column(name="identity")
	public Integer getIdentity() {
		return identity;
	}

	public void setIdentity(Integer identity) {
		this.identity = identity;
	}

	@Column(name="userName", unique=true)
	public String getLogin() {
		return userName;
	}	

	public void setLogin(String userName) {
		this.userName = userName;

	}
}

Obrigado

S

Hum, pelo que entendi, você abre a transação e dá commit antes de executar qualquer alteração nos dados, deve ser isso. Vi isso pelo código beginTransaction().commit();

tente o seguinte:

[code]
Transaction t = session.beginTransaction();
session.insert(objeto);
t.commit();
[\code]

Pode ser que funcione.

brucsantos

Não, não eu mando salvar e depois que do o commit. O codigo era onde dah o erro!

segue o codigo do save.

@Override
	public User save(User user) throws RepositoryExeption {

		Session session = factory.openSession();		
		Transaction transaction = session.beginTransaction();			

		try {

			transaction.begin();
				
			session.save(user);			
		
			transaction.commit();
			
			session.close();

			return user;
		} catch (Exception e) {
			transaction.rollback();
			session.close();
			
			throw new RepositoryExeption(e);
		}
	}
S

Tente remover o transaction.begin(); talvez seja isso.

brucsantos

Continua o mesmo erro. Com os annotations É necessario ter os hbm.xml de minhas entidade? Por que eu não to usando… na minha configuração eu so mapeio as classes de entidade. E quando inicia o sistema o proprio hibernate cria as tabelas no banco. Alguma ideia?

S

Num precisa do hbm não, mas eu não sei o que pode ser.

brucsantos

Muito obrigado samuelm7 pelas dicas…
Ja procurei em um monte de lugares… forums, o proprio forum do hibernate tem um pessoal com esse problema. Poderia ser as configuraçoes no meu banco mais quem gera as tabelas é o hibernate atraves das anotações. Outra possibilidade seria a propriedade “hibernate.jdbc.batch_size”, onde alguns falam pra deixar zero outros pra colocar outro valor, mais mesmo assim nada.

Se vc souber alguma outra coisa ou alguem aqui do forum poder me ajudar…
Enquanto isso vou procurar no google outras soluções!
Obrigado.

A

Da uma olhada nesse topico… talvez ajude!
http://www.guj.com.br/posts/list/30708.java

brucsantos

Puior que não! resrsrs
Valeu andre2k2, mais eu ja tinha visto esse topico antes de postar aqui no guj..... Deu uma ajuda na sequencia, mais na hora de salvar continua o erro!
Esse e o meu hibernate.cfg.xml:

<?xml version="1.0" ?>

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

        <hibernate-configuration>
          <session-factory>
          <!-- Database connection settings -->
       
          		<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
          		<property name="hibernate.connection.url">jdbc:postgresql://10.1.4.49:5432/hibernate_teste</property>
          		<property name="connection.driver_class">org.postgresql.Driver</property>            		
          		<property name="hibernate.connection.username">bcsantos</property>
          		<property name="hibernate.connection.password">postgree</property>          		
          		<property name="hibernate.connection.pool_size">1</property>
          		<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
                <property name="current_session_context_class">thread</property>     		
          		<property name="show_sql">true</property>
          		<property name="hibernate.jdbc.batch_size">0</property>          		
          		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>    
          		<property name="hibernate.connection.autocommit">false</property>             		 
           		      
           		<mapping class="org.brisa.domain.User" />    
           		 	        
          </session-factory>
        </hibernate-configuration>
Obrigado
brucsantos

Bom fiz algumas alterações so que agora tah dando o seguinte errro! sr

java.lang.NoSuchMethodError: org.hibernate.event.PreInsertEvent.getSource()Lorg/hibernate/engine/SessionImplementor;

Alguma sugestão?

brucsantos

Boa tarde pessoal, consegui resolver o problema… era apenas problema de compatibilidade entre os jar’s do hibernate… que ficou assim

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.2.6.ga</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.3.0.ga</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-commons-annotations </artifactId> <version>3.0.0.ga</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-tools</artifactId> <version>3.2.0.beta9a</version> <scope>provided</scope> </dependency>

Agora tenho outra duvida!Q rsrsrs

Seguinte:

O hibernate esta criando altomaticamente as minhas tabelas no banco, so que toda vez que ele inicia o sistema ele da um drop nas tabelas e depois cria novamente…

Ja usei a propriedade

e o objeto

SchemaExport schema = new SchemaExport(config); schema.drop(false,false); schema.create(true,true);

Alguem tem uma ideia???
Obrigado

bsl.lacerda

update

brucsantos

Muito obrigado! Simples assim!
Valeu!

Criado 12 de março de 2009
Ultima resposta 16 de mar. de 2009
Respostas 14
Participantes 4