[Resolvido] Dificuldades com Hibernate e mapeamento

8 respostas
alanrodrigues

Estou tendo dificuldades em conseguir mapear meu banco postgres, principalmente em relação as constraints
Quando é um campo de auto-incremento devo utilizar qual strategy no @GeneretedValue?
Estava utilizando strategy = “GenerationType.SEQUENCE”, como abaixo:

@Entity
@Table(name="Pessoa")
public class Pessoa implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name="PESSOA_ID_GENERATOR", sequenceName="Pessoa_id_seq" )
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PESSOA_ID_GENERATOR")
	private Integer id;

mas isto dava erro, dizendo que nao encontrava a sequenceName=“Pessoa_id_seq”, (e é claro q no banco estava desta maneira)

Passei a utilizar outro tipo de geração de sequenciador…

@Entity
@Table(name="Pessoa")
public class Pessoa implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name="seq", sequenceName="Pessoa_id_seq")
	@GeneratedValue(strategy=GenerationType.AUTO, generator="seq")
	private Integer id;

mas agora estou recebendo outro erro

Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
	at main.main(main.java:21)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81)
	... 1 more
Caused by: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	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:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
	... 1 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into Pessoa (nome, id) values ('name', '10') foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2586)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1811)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2725)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)

Estou perdido nesta parte…
se alguem puder me ajudar agradeço…

8 Respostas

finotti

Um exemplo de como uso

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "funcionario_seq")
@SequenceGenerator(name = "funcionario_seq", sequenceName = "schema.funcionario_seq")
private Long id;
alanrodrigues

finotti:
Um exemplo de como uso

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "funcionario_seq") @SequenceGenerator(name = "funcionario_seq", sequenceName = "schema.funcionario_seq") private Long id;

então… essa era a maneira como eu estava fazendo na primeira vez…
onde sempre tinha o retorno da exception q nao encontrava a sequence do banco…
Será que passei batido em alguma coisa nas configurações?..
assim, o que fiz foi:
1.criei um projeto (dynamic web project) com todas as libs e talz…
2.configurei o persistence.xml de acordo com o hibernate
3.mapeei as entidades

mas na hora de executar a persistencia dava este erro…
:confused:
iria falar que estou meio perdido, mas estou bem perdido…

aloha

Tenta sem o SequenceGenerator… Já trabalhei com postgres (é com sequence) e não me lembro de por essa anotação!

@Id   
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "funcionario_seq")
private Long id;
alanrodrigues

LucasEduardo:
Tenta sem o SequenceGenerator… Já trabalhei com postgres (é com sequence) e não me lembro de por essa anotação!

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "funcionario_seq") private Long id;

Tentei desta maneira, mas não deu:

@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
	private Integer id;
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: avc] Unable to configure EntityManagerFactory
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:375)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
	at main.main(main.java:11)
Caused by: org.hibernate.AnnotationException: Unknown Id.generator: seq
	at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:506)
	at org.hibernate.cfg.AnnotationBinder.processId(AnnotationBinder.java:2176)
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2088)
	at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4008)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3962)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1371)
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1348)
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1492)
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1070)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:279)
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:363)
	... 4 more
ronnytds

cara, eu tenho um sistema aqui onde trabalho, e usávamos SQLServer 2005, mas dai precisamos mudar para postgres, e eu simplesmente não alterei nada, nada mesmo. então o GenerationType que eu estava usando era o IDENTITY.
exemplo:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id;
tenta ai e vê se dá certo.

alanrodrigues

ronnytds:
cara, eu tenho um sistema aqui onde trabalho, e usávamos SQLServer 2005, mas dai precisamos mudar para postgres, e eu simplesmente não alterei nada, nada mesmo. então o GenerationType que eu estava usando era o IDENTITY.
exemplo:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id;
tenta ai e vê se dá certo.

Ainda nada…
a seguir o console:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert: [Pessoa]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
	at main.main(main.java:20)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [Pessoa]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672)
	... 1 more
Caused by: org.postgresql.util.PSQLException: ERRO: relação "pessoa" não existe
  Posição: 13
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2077)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1810)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:498)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:332)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 16 more
ronnytds

cara, olha tua classe e os relacionamentos direitinho, pq esse erro ai diz que ta sendo causado pela falta da relação do objeto “pessoa”.

alanrodrigues

Descobri o que era…
o nome das sequencias no banco estavam maiusculas…

vleu a todos pela ajuda

Criado 31 de março de 2011
Ultima resposta 10 de mai. de 2011
Respostas 8
Participantes 4