Sequence + Hibernate Annotations

Boa noite galera do Guj…
Estou com um problema com Hibernate com Postgres,
To tentando cadastrar um registro mais ele pede sempre o Sequence do Banco… para o Id.
Só que eu quero definir o meu id.

Valeu galera. :smiley:

se colocar algo como @Id(generate=GeneratorType.NONE) não funciona?

Bom dia!!! Blz!!!

Edvaldo testa aí este exemplo abaixo, eu tava com o problema com Oracle e funcionou.

[code]
@Table(name = “PRODUTO”)
SequenceGenerator(name = “SEQUENCE_PRODUTO”, sequenceName = “SEQUENCE_PRODUTO”)
@Entity
public class Produto {

  private Long id;
  private String nome;

@Id(generate = GeneratorType.SEQUENCE, generator = “SEQUENCE_CIDADE”)
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@Column(name = “DESCRICAO”, length = 80)
public String getNome() {
return nome;
}

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

}

Espero ter ajudado!!!

Falooo,

Tubarão - MG

Fala galera… então os dois exemplos que vc passaram, não funcionou…

Isso tá me deixando de cabelo em pé… to quase mudando para outro Banco de Dados pra ver se funciona.

Opa! Foi mal! O certo é:

@Id(generate = GeneratorType.SEQUENCE, generator = “SEQUENCE_PRODUTO”)

Ou outra opção, usa o Mysql:

que aí fica assim:

@Table(name = “PRODUTO”)
@Entity
public class Produto{
private Loing id;
private String nome;

@Id(generate = GeneratorType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

@Column(name = “DESCRICAO”, length = 80)
public String getNome() {
return nome;
}

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

Falooo!!

Aproveita e dá um olhada na documentação do Hibernate.

Tubarão

}

acho que eu nao entendi seu problema, o que eu entendi era que vc queria gerar o id “na mão”, sem sequence, increment, etc…

era isso mesmo?

mostre o seu codigo para vermos como vc tá fazendo.

[]´s
Rodrigo

Então Rodrigo_Gomes
Eu tenho duas tabelas por exemplo Casa e Endereço com o relacionamento @OnetoOne
Fiz o relacionamento com Annotations e blz…
Só que quando eu vou incluir no Banco o Hibernate vai buscar o Sequence da tabela (Postgres)… e isso eu não quero… eu quero gerar esse id via Hibernate. Como antigamente quando colocava o “increment” no hbn.xml.
Uma coisa que estou estranhando é que essa linha de código da erro de compilação:

Bom valeu pela atenção mesmo…

O Código de Exemplo:

[quote]@Table(name=“casa”)
@Entity
@SequenceGenerator(name = “SEQ_CLOG”, sequenceName = “seq_casa”)
public class Casa {

private Integer id_casa;
private String nome;
private Endereco endereco;

@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = “SEQ_CLOG”)
public Integer getId_casa() {
return id_casa;
}
public String getNome() {
return nome;
}
public void setId_casa(Integer id_casa) {
this.id_casa = id_casa;
}
public void setNome(String nome) {
this.nome = nome;
}
} [/quote]
Sendo que a Casa pode pegar o Valor do Sequence só a casa

[quote]
@Entity
@Table(name = “endereco”)
public class Endereco {

private Integer id_endereco;
private String rua;

@Id @GeneratedValue(strategy = GenerationType.AUTO)

public Integer getId_endereco() {
	return id_endereco;
}

public String getRua() {
	return rua;
}

public void setId_endereco(Integer id_endereco) {
	this.id_endereco = id_endereco;
}

public void setRua(String rua) {
	this.rua = rua;
}

}[/quote]
Nesse caso o Endereco tem que receber o id da casa para fazer o relacionamento @OnetoOne entre Casa e Endereço.
Só que quando executo apresenta a seguinte mensagem:

Hibernate: select nextval ('seq_casa') Hibernate: select nextval ('hibernate_sequence') Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get next sequence value at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:65) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:91) at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:631) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:623) at org.hibernate.engine.CascadingAction$8.cascade(CascadingAction.java:202) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108) at org.hibernate.engine.Cascade.cascade(Cascade.java:248) at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:410) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:299) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:114) at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:640) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:614) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:618) at teste.executar.TesteHibernate.teste(TesteHibernate.java:28) at teste.executar.TesteHibernate.main(TesteHibernate.java:14) Caused by: java.sql.SQLException: ERROR: relation "hibernate_sequence" does not exist at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1471) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1256) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:175) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240) at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75) ... 22 more
Essa é minha duvida…
Se vc tiver um exemplo semelhante se não for muito…
Vc poderia me passar…
Valeu pela atenção

Muito obrigado. :frowning:

Ola,

Me desculpe então, eu tinha entendido errado :oops:

vc tentou algo como?

@Id @GeneratedValue (strategy=GenerationType.AUTO) 

ao invés de colocar só o

@Id(generate = GeneratorType.AUTO) 

[]´s
Rodrigo

Então rodrigo_gomes
Tentei sim e gera o mesmo erro. :frowning:

Rodrigo já estou perdendo as minhas esperanças…
não sei o que fazer…

Olá,

Só agora vi seu código. Na verdade, vc nao precisa de sequence no endereço.
O seu caso é exatamente o mesmo desse aqui:
http://www.guj.com.br/posts/list/39415.java

[]´s
Rodrigo

Rodrigo…
Cara continua com erro:

Hibernate: select nextval ('seq_casa') Hibernate: /* get current state com.teste.Endereco */ select endereco_.id_casa, endereco_.rua as rua1_ from endereco endereco_ where endereco_.id_casa=? Hibernate: /* insert com.teste.Casa */ insert into casa (nome, id_casa) values (?, ?) Hibernate: /* insert com.teste.Endereco */ insert into endereco (rua, id_casa) values (?, ?) Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007) at teste.executar.TesteHibernate.teste(TesteHibernate.java:36) at teste.executar.TesteHibernate.main(TesteHibernate.java:17) Caused by: java.sql.BatchUpdateException: Entrada em lote 0 /* insert com.teste.Endereco */ insert into endereco (rua, id_casa) values (Rua do Nova teste , 0) foi abortada. Chame getNextException para ver a causa. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2396) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1257) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:334) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2455) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) ... 7 more
Eu acho que o problema é o PostGres…
que tá me dando pau eu fiz o exemplo do link que vc me passou… mesmo assim olha o erro acima.
Ele não atribui o valor para id_casa da tabela Endereco.
Estou fazendo o seguinte:

:oops: [code]Casa casa = new Casa();
Endereco ends= new Endereco();

	ends.setRua("Rua do Nova teste "); 
	casa.setNome("Chicao"); 		
	casa.setEndereco(ends);
	

	sessao.saveOrUpdate(casa);
	sessao.flush();
	tx.commit();[/code]

Se é problema no postgres cria um sequence pro hibernate:

create sequence hibernate_sequence;

Estou postando aqui mesmo que atrasado, porque já perdi dias com isso.

Um abraço.

Tente dessa maneira pra ver se vai dar certo!! E importante mencionar que no banco de dados existe uma sequencia criada com o nome casa_seq

@Entity
@Table(name = "casa")
@SequenceGenerator(name = "casa_seq", sequenceName = "casa_seq")
public class Casa implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "casa_seq")
	@Column(name = "id")
	private int id; 
   
        //Demais atributos ....

Valeu Eliezer! Testei e realmente funcionou.

eu tava com o mesmo erro só que por um motivo diferente…

vou postar aqui, caso alguém passe pela mesma coisa…

eu começei do zero um sistema… e o hibernate.cfg.xml estava como:

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

ai o hibernate não tinha gerado as tabelas ainda no banco…

ai mudei para “create”… ai ele gerou as tabelas… ai depois mudei pra update de novo…

e rodou normal… foi um leve momento de cabaço da minha parte auahuahuaha

fuis