Boa Tarde,
Estou migrando uma aplicação que roda no Tomcat para o Jboss 7.
Me deparei um problema que não sei o que pode estar afetando esse comportamento.
Entidades que usam @TableGenerator não estão sendo persistidas, pois parece que o hibernate está usando uma sequence ao invés da tabela de pks, conforme o log do erro.
Caused by: org.hibernate.HibernateException: Could not apply work
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWorkInNewTransaction(JtaIsolationDelegate.java:140) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.delegateWork(JtaIsolationDelegate.java:93) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:218) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:120) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:725) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:701) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:705) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:853) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
... 48 more
Caused by: org.hibernate.HibernateException: Unable to perform isolated work
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWork(JtaIsolationDelegate.java:168) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWorkInNewTransaction(JtaIsolationDelegate.java:129) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
... 59 more
Caused by: org.postgresql.util.PSQLException: ERRO: coluna "sequence_next_hi_value" não existe
Posição: 8
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
Agora o controle de transação fica por conta do Jboss (JTA), mas não sei isso pode ser a causa do problema…
Esse é o persistence.xml configurado:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="default">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/nomeDoDataSource</jta-data-source>
<class>....</class>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
Alguém já passou por algo parecido ou utiliza o postgresql com Jboss 7 ?
[quote=renanpto]Boa Tarde,
Estou migrando uma aplicação que roda no Tomcat para o Jboss 7.
Me deparei um problema que não sei o que pode estar afetando esse comportamento.
Entidades que usam @TableGenerator não estão sendo persistidas, pois parece que o hibernate está usando uma sequence ao invés da tabela de pks, conforme o log do erro.
Caused by: org.hibernate.HibernateException: Could not apply work
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWorkInNewTransaction(JtaIsolationDelegate.java:140) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.delegateWork(JtaIsolationDelegate.java:93) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:218) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:120) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:725) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:701) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:705) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:853) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
... 48 more
Caused by: org.hibernate.HibernateException: Unable to perform isolated work
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWork(JtaIsolationDelegate.java:168) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.internal.jta.JtaIsolationDelegate.doTheWorkInNewTransaction(JtaIsolationDelegate.java:129) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
... 59 more
Caused by: org.postgresql.util.PSQLException: ERRO: coluna "sequence_next_hi_value" não existe
Posição: 8
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
Agora o controle de transação fica por conta do Jboss (JTA), mas não sei isso pode ser a causa do problema…
Esse é o persistence.xml configurado:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="default">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/nomeDoDataSource</jta-data-source>
<class>....</class>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
Alguém já passou por algo parecido ou utiliza o postgresql com Jboss 7 ?[/quote]
se não me engano existe um problema do postgresql com jboss 7… acredito que vc tenha que fazer alguma configuração no jboss para resolver isso… nao lembro aonde vi isso… se eu achar passo o link…
Na verdade não é um bug no Postgresql.
É o Hibernate que mudou esse lance dos generators.
É recomendado adicionar a propriedade hibernate.id.new_generator_mappings indicando qual será o tipo de generator usado, no meu caso setei TABLE…
Nota sobre a mudança
We recommend all new projects to use hibernate.id.new_generator_mappings=true as the new generators are more efficient and closer to the JPA 2 specification semantic. However they are not backward compatible with existing databases (if a sequence or a table is used for id generation).
Referência: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html 1.3. Properties
Agora, o erro anterior não acontece mais. Mas o insert não é feito, olhando no log no jboss, a tabela de pks é atualizada certinho.
16:51:54,825 INFO [stdout] (http-localhost-127.0.0.1-8080-1) Hibernate: select sequence_next_hi_value from hibernate_sequences where sequence_name = 'empresa' for update
16:51:54,826 INFO [stdout] (http-localhost-127.0.0.1-8080-1) Hibernate: update hibernate_sequences set sequence_next_hi_value = ? where sequence_next_hi_value = ? and sequence_name = 'empresa'
Só faltou a linha do insert =(.