Problema Hibernate PostgreSQL

8 respostas
ACDias

Olá,

Estava estudando hibernate com annotations e surgiu um problema: quando eu mando inserir no banco, a chave primária (que é serial) está incrementando de 50 em 50 e não de 1 em 1. Alguém sabe o que pode ser isso? Segue o código:
@Entity
@Table(name="events")
@SequenceGenerator(name="event_sequence", sequenceName="events_id_seq")
public class Event implements Serializable
{
	private static final long serialVersionUID = 1847743988750780496L;

	@Id
	@Column(name="id",nullable=false)
	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="event_sequence")
	private long id;

	@Column(name="title",nullable=false)
	private String title;

	@Column(name="data",nullable=false)
	private Date date;

	public Event()
	{
	}

	public Date getDate()
	{
		return date;
	}

	public void setDate(Date date)
	{
		this.date = date;
	}

	public long getId()
	{
		return id;
	}

	public String getTitle()
	{
		return title;
	}

	public void setTitle(String title)
	{
		this.title = title;
	}
}

8 Respostas

marcushlm

tente substituir o SequenceGenerator do id para apenas

não testei, mas pode ser que funcione :wink:

georgesq

coloca um log4j.properties para debug q vc verá cada passo para ele pegar a sequency.

eu tive problemas com sequency no db2 e mudei pra auto increment.

ele em vez de pegar o valor da sequency ele pegava do gerador native e vinha um número nada haver.

e auto em sequency não funciona, pq o hibernate no sequency ele ira requisitar o valor antes de inserir e postar no id da sua entidade.

[s]
baiano

eliasn

Dá uma olhada no meu blog que tem isso respondido lá:
http://jroller.com/page/eliasn?entry=iniciando_no_hibernate_entitymanager_com

Techo correto de código:

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "lancamentos_sequence_generator") @SequenceGenerator(name = "lancamentos_sequence_generator", sequenceName = "lancamentos_sequence_id", allocationSize = 1) @Column(name = "id", nullable = false) private Integer id;

ACDias

marcushlm:
tente substituir o SequenceGenerator do id para apenas

não testei, mas pode ser que funcione :wink:

Num funciona, ele reclama q não existe um hibernate_sequence pra pegar o próximo valor para o atributo.

georgesq:
coloca um log4j.properties para debug q vc verá cada passo para ele pegar a sequency.
Como faço isso? Onde coloco esse arquivo? Preciso importar qual biblioteca?

eliasn:
Dá uma olhada no meu blog que tem isso respondido lá:
http://jroller.com/page/eliasn?entry=iniciando_no_hibernate_entitymanager_com
Valeu. Agora funcionou, mas tenho uma dúvida: o hibernate gera as tabelas automaticamente no banco, certo? Como eu faço para ele gerar pra mim, o que eu tenho que mecher nas configurações?

gilliard_santos

olha, eu sei que voce já resolveu, mas eu também uso Hibernate Annotation no PostgreSQL e só precisei colocar @Id @GeneratedValue no meu atributo chave, sem mais nenhuma configuração e funcionou certinho.
Agora sobre a configuração, é só você colocar o código abaixo no teu hibernate.cfg.xml

<property name="hibernate.hbm2ddl.auto">update</property>

você também pode definir outros valores como por exemplo “create”, mas aí toda vez que você executar a aplicação o banco será reconstruído.

ACDias
gilliard_santos:
olha, eu sei que voce já resolveu, mas eu também uso Hibernate Annotation no PostgreSQL e só precisei colocar @Id @GeneratedValue no meu atributo chave, sem mais nenhuma configuração e funcionou certinho. Agora sobre a configuração, é só você colocar o código abaixo no teu hibernate.cfg.xml
<property name="hibernate.hbm2ddl.auto">update</property>
você também pode definir outros valores como por exemplo "create", mas aí toda vez que você executar a aplicação o banco será reconstruído.
Eu não uso xml! As configurações eu coloco nessa classe:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtils {
	private static final SessionFactory sessionFactory;
	static {
		try {
			sessionFactory = new AnnotationConfiguration().
					addAnnotatedClass(Event.class).
					setProperty("hibernate.connection.driver_class","org.postgresql.Driver").
					setProperty("hibernate.connection.url","jdbc:postgresql:testeHibernate").
					setProperty("hibernate.connection.password", "postgres").
					setProperty("hibernate.connection.username", "postgres").
					setProperty("hibernate.dialect","org.hibernate.dialect.PostgreSQLDialect").
					setProperty("hibernate.hbm2ddl.auto","update").
					buildSessionFactory();
		} catch (Throwable ex) {
			ex.printStackTrace();
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static Session getSession() {
		return sessionFactory.openSession();
	}
}
gilliard_santos

Eu ainda uso xml só para a configuração porque as vezes cada um da equipe testava num banco diferente, então ficava mais facil manter isso em xml e ignorar no cvs/svn. Mas o parametro funcionou né? :smiley:
falow.

ACDias

gilliard_santos:
Mas o parametro funcionou né?
Sim. :smiley: Valeu

Criado 17 de janeiro de 2007
Ultima resposta 18 de jan. de 2007
Respostas 8
Participantes 5