Gerar sequence por anotação

21 respostas
M

Pessoal,

Gostaria de saber se é possível fazer a geração de sequences por anotação, sem ter que criar manualmente no banco?

aguardo resposta

21 Respostas

G

Depende… sua dúvida é referente a JDBC ou JPA?

R

Como assim?

M

O que eu não quero é ter que ir no postgre e criar as sequence manualmente, uma a uma, porque se eu tiver mil sequence é muito trabalho criá-las manualmente. Então, pensei que poderia haver uma forma de criá-las automaticamente. Pesquisando pela net, descobrir que existe uma anotação que aparentemente faz isso, é a @SequenceGenerator. Só que tentei fazer por ela e ocorre um erro.
estou fazendo assim:

@Id
	@SequenceGenerator(name = "cadastro_seq", sequenceName = "cadastro_seq")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="cadastro_seq")
	public Integer getCo_cadastro_pk() {
		return co_cadastro_pk;
	}

e o erro que ocorre é:

ERROR: relation “cadastro_seq” does not exist

R

Nao… sequencegenerator nao é pra criar sequence no banco nao…

É só pra indicar que … seu id vai usar um gerador de chave que é um sequence… mais ou menos assim…

Gerando tabelas automaticamente no banco de dados (Gera o sequence também)
http://www.nextframework.org/site/294/tutorial/gerando-tabelas-automaticamente-no-banco-de-dados

M

entao rogelGarcia,
eu estou usando jpa como ficaria no persistence.xml?

G

malbarbosa, seu primeiro post estava muito confuso. Entendi o que você queria, que é ter sequence ao invés de fazer select manual. Porém é importante saber se você usa algum framework na persistência ou JDBC mesmo.

Já que você usa JPA, o código que você mandou está correto. Porém a mensagem de erro é clara, seu sequence não existe, você precisa criá-lo.

http://www.digipedia.pl/pgsql/8.1/sql-createsequence.html

M

Oi garcia-jj,
é eu vi isso, e criei manualmente mesmo.
agora está aparecendo outro erro.

espero que possa me ajudar.

o erro é o seguinte:

Entrada em lote 0 insert into (aqui são os campos da tabela) values (os valores) foi abortada. Chame getNextException para ver a causa.

R

Entao… chame o getNextException para ver a causa…

R

malbarbosa:
entao rogelGarcia,
eu estou usando jpa como ficaria no persistence.xml?

Como implementacao vc deve estar usando o hibernate…

Coloca a propriedade do tutorial… que vai fazer com que o hibernate gere as tabelas e sequences…

G

Hmm, é bom você analisar essa exception. A mensagem agora não diz nada que possa ajudar. Veja lá no final da exception o que está acontecendo e cole aqui;

M

Aparece assim:

Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (2010-03-24 11:56:37.376000 -03:00:00, [telefone removido], 300) foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:352)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2596)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:247)
	... 17 more
27898 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@1816fb6]
27899 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@1816fb6] after transaction
27899 [main] DEBUG org.springframework.orm.jpa.EntityManagerFactoryUtils  - Closing JPA EntityManager
G

Tem coisa errada nessa exception. Mande a exception inteira como anexo (não copie e cole no editor porque fica muito pesado). Assim posso entender melhor o erro.

Abraços

R

O problema é que nao tá mostrando o nextException no log

Veja se em outra parte do log tem outras mensagens…

M

Essas é toda a excessão, incluindo um pequena parte do debug que acho que poder ser interessante você ver.

20903 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Exposing JPA transaction as JDBC transaction [SimpleConnectionHandle: org.postgresql.jdbc3.Jdbc3Connection@9e5e21]
Hibernate: select nextval ('cadastro_seq')
21517 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Initiating transaction commit
21517 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@199f755]
Hibernate: insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (?, ?, ?)
21165 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
21165 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Entrada em lote 0 insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (2010-03-24 14:18:31.853000 -03:00:00, [telefone removido], 17) foi abortada. Chame getNextException para ver a causa.
21165 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42P01
21165 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: relation "siabmtb001_cadastro" does not exist
21165 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:456)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy25.insertCadastro(Unknown Source)
	at br.gov.caixa.seguranca.siabm.persistence.dao.impl.CadastroDaoImpl.main(CadastroDaoImpl.java:50)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (2010-03-24 14:18:31.853000 -03:00:00, [telefone removido], 17) foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:352)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2596)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 17 more
21548 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Initiating transaction rollback after commit exception
org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:630)
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:92)
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:460)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy25.insertCadastro(Unknown Source)
	at br.gov.caixa.seguranca.siabm.persistence.dao.impl.CadastroDaoImpl.main(CadastroDaoImpl.java:50)
Caused by: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:456)
	... 8 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (2010-03-24 14:18:31.853000 -03:00:00, [telefone removido], 17) foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:352)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2596)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 17 more
21549 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@199f755]
21549 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager  - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@199f755] after transaction
21549 [main] DEBUG org.springframework.orm.jpa.EntityManagerFactoryUtils  - Closing JPA EntityManager
Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:630)
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:92)
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:460)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy25.insertCadastro(Unknown Source)
	at br.gov.caixa.seguranca.siabm.persistence.dao.impl.CadastroDaoImpl.main(CadastroDaoImpl.java:50)
Caused by: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:456)
	... 8 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into siabmtb001_cadastro (dt_cadastro, co_nis, co_cadastro_pk) values (2010-03-24 14:18:31.853000 -03:00:00, [telefone removido], 17) foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2534)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:352)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2596)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 17 more
R

Tá dando erro de gramática… q coisa…

posta o código que vc usou pra salvar…

G

Não existe essa tabela:

R

É isso mesmo que o garcia falou… (nem tinha visto :D)

G

É tanto stacktrace que passa despercebido.

Uma coisa é você ativar o update-ddl conforme o Rógel falou. Isso é bacana porque o hibernate irá sempre verificar a estrutura do banco e pode atualizar para você. No caso se algum objeto não for encontrado (seja banco, sequence ou colunas) ele irá criar.

M

Pessoal,

acho que o erro aqui é um que está aparecendo logo no início:

DEBUG org.hibernate.util.JDBCExceptionReporter  - Could not execute JDBC batch update [insert into siabmtb001_cliente (dt_cadastro, co_nis, co_cliente_pk) values (?, ?, ?)]

o que vocês acham?

B

Roda o sql no banco e ve o que acontece…

G

A mensagem é clara, não existe a tabela no banco. O ideal é você verificar se todas as tabelas estão criadas.

Criado 24 de março de 2010
Ultima resposta 25 de mar. de 2010
Respostas 21
Participantes 4