JPA Hibernate Postgresql

18 respostas
R

Pessoal, iniciando com JPA estou com o problema seguinte.
Tenho um classe Editora anotada pra persistir num banco postgres.

@Entity 
public class Editora { 
        @Id 
        @Column(insertable=false) 
        @GeneratedValue(strategy = GenerationType.SEQUENCE) 
        private Long id; 
        private String nome; 
        private String email; 
        //Gets and Setters

Fiz uma classe para testar a criação da tabela via hibernate…

.
.
.
public static void main(String[] args) { 
                EntityManagerFactory factory = 
Persistence.createEntityManagerFactory("livraria"); 
                factory.close(); 
}

A tabela foi criada com sucesso.
Porém, obtenho um erro qndo vou inserir objetos na tabela.
A classe que criei para inserção foi:

.
.
.
public static void main(String[] args) { 
                Editora editora1 = new Editora(); 
                editora1.setNome("IFPB Press"); 
                editora1.setEmail("[email removido]"); 
                EntityManagerFactory factory = 
Persistence.createEntityManagerFactory("livraria"); 
                EntityManager manager = factory.createEntityManager(); 
                manager.persist(editora1); 
                manager.getTransaction().begin(); 
                manager.getTransaction().commit(); 
        }

O console exibe a seguinte mensagem:

SEVERE: ERRO: erro de sintaxe em ou próximo a "call"
  Posição: 1
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not get next sequence value

Alguém teria uma dica sobre o que pode estar acontecendo???

18 Respostas

F

Seguinte, faltou especificar qual sequence deverá ser chamada, tem uma anotaçao @Sequence<> e lá vc porá o nome da sequence a ser chamada no momento da persistencia.

Feito isto, em @GeneratedValue(strategy = GenerationType.SEQUENCE) tem o atributo name que deverá indicar a sequence em questão que vc nomeou na anotação acima.

Teste aí.

R

Fabio, seria assim?

@Entity
@SequenceGenerator(name="SG")
public class Editora {
	
	@Id	
	@Column(insertable=false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SG")
 	private Long id;

Se for dessa forma, testei e recebi o mesmo erro…

A sintaxe é essa mesmo!?

Alguma outra sugestão!

Vlw!

J

Segue como fiz, talvez te ajude:

@SequenceGenerator(name="SequenceParaTabela", schema=esquemaDoBanco, sequenceName="nomeDaSequenceNoBanco", allocationSize=1)
.
.
.
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SequenceParaTabela")

É só alterar esquemaDoBanco e nomeDaSequenceNoBanco

R

Seria assim mesmo?

@Entity
@SequenceGenerator(name="SequenceParaTabela", schema="public", sequenceName="hibernate_sequence", allocationSize=1)  
public class Editora {
	
	@Id	
	@Column(insertable=false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SequenceParaTabela")
	private Long id;

.
.
.

Se for assim, também deu erro… o mesmo erro.

Pra testar, deixei a anotação dessa forma, gerei novamente a tabela e tentei inserir os dados novamente, mas sem sucesso… de toda forma, valeu a atenção…

J

Boa noite,

Vamos ver…

Sua tabela no banco é Editora?

Tente colocar o nome da tabela.

@Entity @Table(name = "editora")

e também altere

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false, unique = true) private Long id;

No banco coloque id como tipo serial.

Vlw

L

insertable=false? É isso mesmo?

S

revivendo o tópico.

estou com o mesmo problema, ja fiz tudo acima, e continua o problema.

Ja alterei o nome da sequence, ja deixei a padrao, ja apaguei a tabela e a sequence, e foi gerado novamente automaticamente.

“E agora, quem poderá me ajudar??”

Y

Duas coisas.
Primeiro, você cria a base através do persistence.xml com a propriedade ‘hibernate.hbm2ddl.auto’ ou utilizando um comando SQL?
Se for via SQL, você cria uma sequence para esse campo?
Segundo, as anotações devem ficar assim:

@Id
    @SequenceGenerator(name="USUARIO_ID_GENERATOR", sequenceName="USUARIO_ID_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USUARIO_ID_GENERATOR")
    private Integer id;

Lembre-se, o atributo sequenceName utiliza uma sequence criada no banco, portanto a mesma precisa estar lá para ser utilizada.

[]'s
Daniel

S

o banco é criado através do hibernate.

meu ID esta assim:

@Id
	@SequenceGenerator(name = "FATURACLARO_ID", sequenceName = "id_faturaclaro", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FATURACLARO_ID")
	private Integer id;

o sequence é gerado no banco, mas na hora de salvar ocorre o problema.

método para salvar:

Session em = HibernateSessionFactory.getSession();
			Transaction trans = null;
			try {
				trans = em.beginTransaction();
				for (FaturaClaroDetalhe o : faturaClaroDetalheList) {
					o.setId(null);
					em.merge(o);
				}
				trans.commit();
			} catch (Exception e) {
				if (trans.isActive()) {
					trans.rollback();
				}
				throw e;
			} finally {
				em.close();
			}

quando tenta executar o primeiro “em.merge(o);” ocorre o erro.

Y

Tenta trocar o em.merge(o); por em.persist(o);

[]'s
Daniel

S

mesmo proplema… :frowning:

segue o LOG:

ERROR [STDERR] org.hibernate.exception.GenericJDBCException: could not get next sequence value

at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)

at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:53)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)

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:618)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
L

Para de usar Sequence e usa Geration Type como Identity. Verifique se o campo ID está como serial.

S

@Lucas Emanuel… fiz o que voce disse…

apaguei minhas tabelas, para gerar tudo novamente, pra nao ter perigo de ser algo no banco.

Tudo foi gerado.

Mas o problema agora é outro:

Segue o LOG:

org.hibernate.exception.GenericJDBCException: could not insert: [br.sistema.entity.FaturaClaroDetalhe]

at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)

at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)

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:618)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)

procurei algo aqui no forum, alguns dizem que era problema no banco, mas o banco foi gerado pelo persistence.

o que pode ser??

S

Tambem tentei com GenerationType.AUTO

mas voltou a ocorrer o erro:

org.hibernate.exception.GenericJDBCException: could not get next sequence value

at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)

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:99)

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:618)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)

at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)

*novamente apaguei as tabelas e a sequence do banco e foi gerado automaticamente.

S

:smiley:

putz, achei o problema!!!

antes de executar o SAVE, eu fazia um FIND no banco, mas o parametro que eu estava passando era diferente do campo no banco.
Entao o SQL dava erro (mas nao sei o pq nao estourava erro) e ao tentar salvar ele pegava a mesma transação e nao conseguia executar por ter ocorrido um erro anterior.

Obrigado a todos que tentaram me ajudar!!!

S

:smiley:

B

Acho que pode te ajudar http://code.google.com/p/jpa-component/wiki/Doc_PT_Br

L

yorgan:
Duas coisas.
Primeiro, você cria a base através do persistence.xml com a propriedade ‘hibernate.hbm2ddl.auto’ ou utilizando um comando SQL?
Se for via SQL, você cria uma sequence para esse campo?
Segundo, as anotações devem ficar assim:

@Id
    @SequenceGenerator(name="USUARIO_ID_GENERATOR", sequenceName="USUARIO_ID_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USUARIO_ID_GENERATOR")
    private Integer id;

Lembre-se, o atributo sequenceName utiliza uma sequence criada no banco, portanto a mesma precisa estar lá para ser utilizada.

[]'s
Daniel

Vc e meu Heroi,

xD

utilizei essas anotações ai para persisti no oracle e consegui \o/

Criado 6 de fevereiro de 2011
Ultima resposta 27 de fev. de 2012
Respostas 18
Participantes 10