Pessoal..
Hoje tive o erro: PSQLException: ERROR: syntax error at or near "User"
Isso acontece pois a entidade que eu criei se chama User e no PostgreSQL deve existir uma tabela com esse nome ou user é uma palavra reservada.
Então mudei minha entidade para ter outro nome de tabela e não o default:
@Entity
@Table(name="LOGIN_USER")
public class User {
Então funcionou perfeitamente.
Abraço!
Adriano Schmidt
Mostrando postagens com marcador EJB/JPA. Mostrar todas as postagens
Mostrando postagens com marcador EJB/JPA. Mostrar todas as postagens
sábado, 27 de dezembro de 2014
quinta-feira, 10 de julho de 2014
Join HQL
Quando no Java temos uma Entidade que tem uma lista de outra entidade.
E vamos fazer uma consulta com HQL (Hibernate Query Language) e precisamos acessar um atributo de um item da lista precisamos fazer um JOIN.
Segue um exemplo bem básico de como podemos fazer:
select a from TabelaA a inner join a.bList b inner join b.c.dList d where d.id = :id"
select a from TabelaA a, in (a.bList) b, in (b.c.dList) d where d.id = :id
Abraço!
Adriano Schmidt
E vamos fazer uma consulta com HQL (Hibernate Query Language) e precisamos acessar um atributo de um item da lista precisamos fazer um JOIN.
Segue um exemplo bem básico de como podemos fazer:
select a from TabelaA a inner join a.bList b inner join b.c.dList d where d.id = :id"
select a from TabelaA a, in (a.bList) b, in (b.c.dList) d where d.id = :id
Abraço!
Adriano Schmidt
quarta-feira, 25 de junho de 2014
Tunning de aplicações Java
Pessoal.. vou postar aqui alguns itens que sempre recomendo para melhorar o desempenho de uma aplicação Java.
Fazer testes de desempenho ou analisar as aplicações com JMeter, NewRelic, VisualVM, jConsole é o mundo ideal! Através disso é possível identificar os gargalos da aplicação! Os pontos que mais utilizam recursos computacionais como memória e processador por exemplo.
Configurar adequadamente a memória utilizada.. ou seja, estude xms, xmx, maxpermgen..
Uma dica é sempre colocar o xms e o xmx igual em ambiente de produção. E o ideal não é simplesmente colocar o valor mais alto possível, é preciso analisar qual é o valor ideal, e isso é descoberto através de testes e monitoramento, ou através do feeling e analisando com o tempo como a aplicação se comporta.
Recomendo utilizar a JRockit como JVM. Ela é mantida pela Oracle também e tem um gerenciamento de memória muito melhor que das outras JVMs, o garbage collector funciona bem melhor.
Mas só tem pra Java 6, mas em todos os clientes que atuo, sempre que possível, implanto a JRockit, é notável o ganho obtido no uso de recursos computacionais como memória.
Dá pra fazer tunning também de acordo com a tecnologia que você está usando.. JSF... JMS... pool de EJB... Banco de dados...
Dá pra monitorar a aplicação pelo jenkins também, fazer um job que checa a memória e qualquer avisa a equipe de infra ou até reinicia, dá pra usar o nagios...
Etc... Existem milhões de outras coisas que podem ser feitas, mas como escrevi esse texto para ajudar um amigo, resolvi postá-lo aqui para talvez ajudar outras pessoas também.
Abraços!
Adriano Schmidt
Fazer testes de desempenho ou analisar as aplicações com JMeter, NewRelic, VisualVM, jConsole é o mundo ideal! Através disso é possível identificar os gargalos da aplicação! Os pontos que mais utilizam recursos computacionais como memória e processador por exemplo.
Configurar adequadamente a memória utilizada.. ou seja, estude xms, xmx, maxpermgen..
Uma dica é sempre colocar o xms e o xmx igual em ambiente de produção. E o ideal não é simplesmente colocar o valor mais alto possível, é preciso analisar qual é o valor ideal, e isso é descoberto através de testes e monitoramento, ou através do feeling e analisando com o tempo como a aplicação se comporta.
Recomendo utilizar a JRockit como JVM. Ela é mantida pela Oracle também e tem um gerenciamento de memória muito melhor que das outras JVMs, o garbage collector funciona bem melhor.
Mas só tem pra Java 6, mas em todos os clientes que atuo, sempre que possível, implanto a JRockit, é notável o ganho obtido no uso de recursos computacionais como memória.
Dá pra fazer tunning também de acordo com a tecnologia que você está usando.. JSF... JMS... pool de EJB... Banco de dados...
Dá pra monitorar a aplicação pelo jenkins também, fazer um job que checa a memória e qualquer avisa a equipe de infra ou até reinicia, dá pra usar o nagios...
Etc... Existem milhões de outras coisas que podem ser feitas, mas como escrevi esse texto para ajudar um amigo, resolvi postá-lo aqui para talvez ajudar outras pessoas também.
Abraços!
Adriano Schmidt
quarta-feira, 16 de abril de 2014
show_sql=true não exibe os parâmetros
Após setar o show-sql como true no meu persistence.xml no meu projeto que roda no JBoss EAP 6.2 (ou Jboss AS7, ou WildFly) as queries apareceram no log, mas o valor dos parâmetros não. Aparecia somente assim:
Para fazer os valores aparecerem entrei no arquivo standalone.xml do meu JBoss e fui no subsystem logging (esse arquivo tem várias tags subsystem, uma delas tem o name logging)
Então, junto com os outros loggers adicionei o logger abaixo:
Após reiniciar o JBoss, o log ficou assim:
Fonte: http://stackoverflow.com/questions/9159752/how-to-get-jdbc-binding-parameters-from-hibernate-in-jboss-7
21:10:03,314 INFO [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =?
Para fazer os valores aparecerem entrei no arquivo standalone.xml do meu JBoss e fui no subsystem logging (esse arquivo tem várias tags subsystem, uma delas tem o name logging)
Então, junto com os outros loggers adicionei o logger abaixo:
<logger category="org.hibernate.type.descriptor.sql.BasicBinder"> <level name="TRACE"/> </logger>
Após reiniciar o JBoss, o log ficou assim:
21:15:04,234 INFO [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =? 21:15:04,234 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (http-/0.0.0.0:8080-3) binding parameter [1] as [BIGINT] - 600
Fonte: http://stackoverflow.com/questions/9159752/how-to-get-jdbc-binding-parameters-from-hibernate-in-jboss-7
quarta-feira, 12 de março de 2014
JBoss x Tomcat
Por que usar JBoss ao invés de Tomcat?
Primeiramente é bom explicar que o Tomcat é um Web Container (contém engines para Servlet e JSP), já o JBoss é um Application Server (container para a plataforma JEE, contém um Web Container, porém tem um EJB container e outras engines).
Para aplicações simples você consegue utilizar um Web Container, para aplicações com mais tecnologias (EJB por exemplo), você até consegue usar um Web Container, porém, terá que adicionar muitas bibliotecas e configurações nele. Em um Application Server tudo é nativo.
Em 2010 por exemplo, fazia muito sentido utilizar apenas um Web Container para uma aplicação simples pois os Application Servers eram muito pesados, consumiam muitos recursos computacionais, demoravam para iniciar e eram difíceis de manter, porém os Application Servers em 2014 não tem mais estes problemas. A própria Apache, criadora do Tomcat, criou seu próprio Application Server chamado TomEE para ser usado no lugar do Tomcat. (http://tomee.apache.org/apache-tomee.html)
Os Application Servers trabalham com profiles, que define o que será carregado, o profile mais leve dos Application Servers é como um Web Container, por isso, não existe mais a necessidade de se trabalhar com Tomcat em projetos novos, a não ser que você queira manter padrão com outras aplicações da empresa ou algo assim, porém, essa decisão traria muitas outras dificuldades para o desenvolvimento e controle da infraestrutura de uma aplicação JEE.
Abraços!
Adriano Schmidt
Primeiramente é bom explicar que o Tomcat é um Web Container (contém engines para Servlet e JSP), já o JBoss é um Application Server (container para a plataforma JEE, contém um Web Container, porém tem um EJB container e outras engines).
Para aplicações simples você consegue utilizar um Web Container, para aplicações com mais tecnologias (EJB por exemplo), você até consegue usar um Web Container, porém, terá que adicionar muitas bibliotecas e configurações nele. Em um Application Server tudo é nativo.
Em 2010 por exemplo, fazia muito sentido utilizar apenas um Web Container para uma aplicação simples pois os Application Servers eram muito pesados, consumiam muitos recursos computacionais, demoravam para iniciar e eram difíceis de manter, porém os Application Servers em 2014 não tem mais estes problemas. A própria Apache, criadora do Tomcat, criou seu próprio Application Server chamado TomEE para ser usado no lugar do Tomcat. (http://tomee.apache.org/apache-tomee.html)
Os Application Servers trabalham com profiles, que define o que será carregado, o profile mais leve dos Application Servers é como um Web Container, por isso, não existe mais a necessidade de se trabalhar com Tomcat em projetos novos, a não ser que você queira manter padrão com outras aplicações da empresa ou algo assim, porém, essa decisão traria muitas outras dificuldades para o desenvolvimento e controle da infraestrutura de uma aplicação JEE.
Abraços!
Adriano Schmidt
segunda-feira, 25 de novembro de 2013
Tuning EJB Pool JBoss 7
Pessoal..
Hoje eu tive o erro: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".
Isso aconteceu pois estourou o pool de EJBs..
Basicamente ele funciona assim... tem 20 instâncias no pool..
Cada vez que uma pessoa está usando o sistema e aperta em um botão ou entra em uma tela que chama um serviço EJB, uma instância é tirada do pool..
Se 20 pessoas fizerem isso ao mesmo tempo, acessando o mesmo serviço, as 20 instâncias estarão ocupadas, então se uma 21ª pessoa precisar chamar o serviço EJB, ela vai ter que esperar alguma instância parar de ser utilizada e voltar ao pool... se isso levar mais de 5 minutos, acontece o erro do log: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".
Se tiver 50 pessoas acessando ao mesmo tempo, a 50ª terá que esperar 30 instâncias serem liberadas.
Esse valor de 20 instâncias e o tempo de timeout são configuráveis.
No caso de um sistema, ou de um jboss que tenha vários sistemas, que tenha muitos usuários simultâneos é interessante aumentar o pool de EJBs.
Para saber o melhor valor existem três alternativas:
1) Deve ser feito monitoramento do pool através do JBoss CLI ou de algum profiler que tenha essa funcionalidade
2) Testes de desempenho com JMeter (ou outra ferramenta) e avaliar o desempenho da aplicação com diferentes valores de pool.
3) Seguir o feeling e aumentar de 20 para 30 ou 40 e ir sentindo como a aplicação se comporta com o tempo.
Para alterar os valores do pool você pode fazer isso:
- Direto no standalone.xml ou domain.xml
- No Web Console
- Via JBoss CLI
Infelizmente apenas conseguimos definir o pool para o subsystem inteiro, não conseguimos definir por aplicação ou até mesmo por Serviço EJB.
Existem 3 pool que podem ser alterados:
- slsb-strict-max-pool > é utilizado pelos stateless service bean (foi esse que causou meu erro)
- mdb-strict-max-pool > MDB, utilizado por serviços JMS
- thread-pools > é usado pelo EJB Timer, pelo Asynchronous EJB e para fazer chamadas de EJB remotos.. Caso você use estas funcionalidades e sinta necessidade, esse pool pode ser alterado também. Nesse caso você pode até criar pools separados pois estas 3 funcionalidades compartilham o mesmo pool.
Mais detalhes sobre o subsystem EJB: https://docs.jboss.org/author/display/AS71/EJB3+subsystem+configuration+guide
É isso aí : ) abraço!
Adriano Schmidt
Hoje eu tive o erro: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".
Isso aconteceu pois estourou o pool de EJBs..
Basicamente ele funciona assim... tem 20 instâncias no pool..
Cada vez que uma pessoa está usando o sistema e aperta em um botão ou entra em uma tela que chama um serviço EJB, uma instância é tirada do pool..
Se 20 pessoas fizerem isso ao mesmo tempo, acessando o mesmo serviço, as 20 instâncias estarão ocupadas, então se uma 21ª pessoa precisar chamar o serviço EJB, ela vai ter que esperar alguma instância parar de ser utilizada e voltar ao pool... se isso levar mais de 5 minutos, acontece o erro do log: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".
Se tiver 50 pessoas acessando ao mesmo tempo, a 50ª terá que esperar 30 instâncias serem liberadas.
Esse valor de 20 instâncias e o tempo de timeout são configuráveis.
No caso de um sistema, ou de um jboss que tenha vários sistemas, que tenha muitos usuários simultâneos é interessante aumentar o pool de EJBs.
Para saber o melhor valor existem três alternativas:
1) Deve ser feito monitoramento do pool através do JBoss CLI ou de algum profiler que tenha essa funcionalidade
2) Testes de desempenho com JMeter (ou outra ferramenta) e avaliar o desempenho da aplicação com diferentes valores de pool.
3) Seguir o feeling e aumentar de 20 para 30 ou 40 e ir sentindo como a aplicação se comporta com o tempo.
Para alterar os valores do pool você pode fazer isso:
- Direto no standalone.xml ou domain.xml
- No Web Console
- Via JBoss CLI
Infelizmente apenas conseguimos definir o pool para o subsystem inteiro, não conseguimos definir por aplicação ou até mesmo por Serviço EJB.
Existem 3 pool que podem ser alterados:
- slsb-strict-max-pool > é utilizado pelos stateless service bean (foi esse que causou meu erro)
- mdb-strict-max-pool > MDB, utilizado por serviços JMS
- thread-pools > é usado pelo EJB Timer, pelo Asynchronous EJB e para fazer chamadas de EJB remotos.. Caso você use estas funcionalidades e sinta necessidade, esse pool pode ser alterado também. Nesse caso você pode até criar pools separados pois estas 3 funcionalidades compartilham o mesmo pool.
Mais detalhes sobre o subsystem EJB: https://docs.jboss.org/author/display/AS71/EJB3+subsystem+configuration+guide
É isso aí : ) abraço!
Adriano Schmidt
sábado, 26 de janeiro de 2013
Could not determine type for [..] at table [..] for columns [..]
Oi, hoje tive o erro abaixo ao iniciar minha aplicação EJB no JBoss 6
O Problema era que eu tinha uma coluna mapeada assim:
Mas ela precisa do @ManyToOne
Ao fazer dessa forma funcionou normalmente : )
Vaaleu!!
Adriano Schmidt
13:57:23,368 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
13:57:23,380 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=test-ear-1.0.0.ear/test-ejb-1.0.0.jar#l8 state=Create: javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) [:3.5.5-Final]
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) [:3.5.5-Final]
at org.jboss.jpa.builder.DefaultCEMFBuilder.build(DefaultCEMFBuilder.java:47) [:1.0.2-alpha-1]
[...]
at java.lang.Thread.run(Thread.java:662) [:1.6.0_25]
Caused by: org.hibernate.MappingException: Could not determine type for: br.com.localhost8080.test.company.Company, at table: MY_TABLE, for columns: [org.hibernate.mapping.Column(company)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:291) [:3.5.5-Final]
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:275) [:3.5.5-Final]
at org.hibernate.mapping.Property.isValid(Property.java:217) [:3.5.5-Final]
O Problema era que eu tinha uma coluna mapeada assim:
@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;
Mas ela precisa do @ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;
Ao fazer dessa forma funcionou normalmente : )
Vaaleu!!
Adriano Schmidt
quarta-feira, 24 de outubro de 2012
NoClassDefFoundError SessionLogEntry
Olá,
Hoje tive o erro java.lang.NoClassDefFoundError: org/eclipse/persistence/logging/SessionLogEntry ao fazer deploy da minha aplicação no WebSphere 8.
Segue log completo:
O erro era porque eu não tinha nenhuma classe com @Entity na minha aplicação.. aí dava esse NoClassDefFoundError SessionLogEntry...
Ao adicionar essa classe:
O erro parou de acontecer!
Tive um erro semelhante a esse que postei em: http://localhost8080.blogspot.com.br/2012/10/nomodulefileexception.html
Vaaaaleu!!
Adriano Schmidt
Hoje tive o erro java.lang.NoClassDefFoundError: org/eclipse/persistence/logging/SessionLogEntry ao fazer deploy da minha aplicação no WebSphere 8.
Segue log completo:
[23/10/12 14:31:14:570 BRST] 00000025 AppManagement W ADMA0116W: Unable to start: myapp-ear using: WebSphere:name=ApplicationManager,process=server1,platform=proxy,node=localhost8080Node01,version=8.0.0.0,type=ApplicationManager,mbeanIdentifier=ApplicationManager,cell=localhost8080Node01Cell,spec=1.0 exception is: javax.management.MBeanException: Exception thrown in RequiredModelMBean while trying to invoke operation startApplication
at javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1112)
[...]
Caused by: com.ibm.ws.exception.RuntimeError: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/eclipse/persistence/logging/SessionLogEntry
at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:753)
[...]
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4218)
O erro era porque eu não tinha nenhuma classe com @Entity na minha aplicação.. aí dava esse NoClassDefFoundError SessionLogEntry...
Ao adicionar essa classe:
package br.com.localhost8080.myapp;
import javax.persistence.Entity;
@Entity
public class MyTest {
}
O erro parou de acontecer!
Tive um erro semelhante a esse que postei em: http://localhost8080.blogspot.com.br/2012/10/nomodulefileexception.html
Vaaaaleu!!
Adriano Schmidt
quarta-feira, 10 de outubro de 2012
NoModuleFileException
Hoje tive o erro abaixo ao fazer deploy da minha aplicação no websphere 8:
Isso aconteceu pois era um projeto novo que eu estava criando e o meu jar de EJBs não tinha nehum EJB, não tinha nenhuma classe com @Stateless.
Se eu criasse uma classe como a classe abaixo o problema não acontecia mais.
@Stateless
public class MeuTesteServiceBean {
}
Vaaaleu!!
Adriano Schmidt
Archive is not a valid EJB JAR File because the deployment descriptor can not be found (case sensitive): META-INF/ejb-jar.xml
org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl initModuleFileFromEAR Ignoring ClassCastException [ org.eclipse.jst.j2ee.commonarchivecore.internal.impl.FileImpl incompatible with org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile ]
org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException: dd_in_ear_load_EXC_]
Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.NoModuleFileException: A file does not exist for module element having uri: myproject-ejb-1.0-SNAPSHOT.jar
Isso aconteceu pois era um projeto novo que eu estava criando e o meu jar de EJBs não tinha nehum EJB, não tinha nenhuma classe com @Stateless.
Se eu criasse uma classe como a classe abaixo o problema não acontecia mais.
@Stateless
public class MeuTesteServiceBean {
}
Vaaaleu!!
Adriano Schmidt
sexta-feira, 19 de agosto de 2011
identifier of an instance of Entity was altered from 1 to null
Olá, hoje aconteceu o erro abaixo para mim:
identifier of an instance of br.com.localhost8080.MyEntity was altered from 1 to null
Sem querer eu estava alterando o id da entidade:
myEntity.setId(1);
isso causou o erro... se o erro está acontecendo pra você verifique no seu código se por algum motivo você não está trocando o id (chave) da entidade.
Vaaaleu!
Adriano Schmidt
identifier of an instance of br.com.localhost8080.MyEntity was altered from 1 to null
Sem querer eu estava alterando o id da entidade:
myEntity.setId(1);
isso causou o erro... se o erro está acontecendo pra você verifique no seu código se por algum motivo você não está trocando o id (chave) da entidade.
Vaaaleu!
Adriano Schmidt
quarta-feira, 29 de junho de 2011
No Dialect mapping for JDBC type: 2004
Olá..
Um cliente aqui usa o banco de dados Informix.. ao testar nosso projeto nesse banco tive o seguinte erro:
13:57:15,040 INFO [DatabaseMetadata] table not found: MY_TABLE
13:57:15,041 ERROR [SchemaUpdate] could not complete schema update: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2004
at org.hibernate.dialect.TypeNames.get(TypeNames.java:79) [:3.5.5-Final]
at org.hibernate.dialect.TypeNames.get(TypeNames.java:104) [:3.5.5-Final]
at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:347) [:3.5.5-Final]
O problema era que temos uma tabela que guarda uma imagem em uma de suas colunas e usamos @Lob no seu mapeamento. O Dialeto do Informix não aceitou o @Lob.
Para resolver extendi o Dialeto do Informix e adicionei as seguinte linhas no construtor:
registerColumnType(Types.BLOB, "blob");
registerColumnType(Types.CLOB, "clob");
Mais detalhes em http://www.snailshell.de/blog/archives/2007/06/entry_108.html
Alterei o persistence.xml para usar o dialeto que criei e o projeto funcionou perfeitamente.
Outras fontes:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2646
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2523
Vaaleu
Adriano Schmidt
Um cliente aqui usa o banco de dados Informix.. ao testar nosso projeto nesse banco tive o seguinte erro:
13:57:15,040 INFO [DatabaseMetadata] table not found: MY_TABLE
13:57:15,041 ERROR [SchemaUpdate] could not complete schema update: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2004
at org.hibernate.dialect.TypeNames.get(TypeNames.java:79) [:3.5.5-Final]
at org.hibernate.dialect.TypeNames.get(TypeNames.java:104) [:3.5.5-Final]
at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:347) [:3.5.5-Final]
O problema era que temos uma tabela que guarda uma imagem em uma de suas colunas e usamos @Lob no seu mapeamento. O Dialeto do Informix não aceitou o @Lob.
Para resolver extendi o Dialeto do Informix e adicionei as seguinte linhas no construtor:
registerColumnType(Types.BLOB, "blob");
registerColumnType(Types.CLOB, "clob");
Mais detalhes em http://www.snailshell.de/blog/archives/2007/06/entry_108.html
Alterei o persistence.xml para usar o dialeto que criei e o projeto funcionou perfeitamente.
Outras fontes:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2646
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2523
Vaaleu
Adriano Schmidt
segunda-feira, 21 de março de 2011
Unable to find XML mapping file in classpath
Ao usar a tag <mapping-file> no meu persistence.xml tive o seguinte erro quando iniciei o JBoss:
Unable to find XML mapping file in classpath: br.com.localhost8080.Teste2.hbm.xml
O erro era que a separação dos pacotes deve ser feita com barra e não ponto:
Assim:
<mapping-file>br/com/localhost8080/Teste2.hbm.xml</mapping-file>
Não assim:
<mapping-file>br.com.localhost8080.Teste2.hbm.xml</mapping-file>
Vaaleu!
Adriano Schmidt
Unable to find XML mapping file in classpath: br.com.localhost8080.Teste2.hbm.xml
O erro era que a separação dos pacotes deve ser feita com barra e não ponto:
Assim:
<mapping-file>br/com/localhost8080/Teste2.hbm.xml</mapping-file>
Não assim:
<mapping-file>br.com.localhost8080.Teste2.hbm.xml</mapping-file>
Vaaleu!
Adriano Schmidt
cvc-complex-type.2.4.a: Invalid content was found starting with element 'mapping-file'
Olá,
Ao utilizar a tag <mapping-file> no persistence.xml eu tive o seguinte erro:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'mapping-file'. One of '{"http://
java.sun.com/xml/ns/persistence":class, "http://java.sun.com/xml/ns/persistence":exclude-unlisted-classes,
"http://java.sun.com/xml/ns/persistence":properties}' is expected.
O problema é que no meu persistence.xml eu tinha uma tag <class> antes da tag <mapping-file>. Para resolver só joguei a tag class pra baixo da tag <mapping-file>. Assim:
<mapping-file>br/com/localhost8080/Teste2.hbm.xml</mapping-file>
<class>br.com.localhost8080.Teste1</class>
Caso você use a tag <jar-file> ela também deve estar depois da tag <mapping-file>
Vaaleu!
Ao utilizar a tag <mapping-file> no persistence.xml eu tive o seguinte erro:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'mapping-file'. One of '{"http://
java.sun.com/xml/ns/persistence":class, "http://java.sun.com/xml/ns/persistence":exclude-unlisted-classes,
"http://java.sun.com/xml/ns/persistence":properties}' is expected.
O problema é que no meu persistence.xml eu tinha uma tag <class> antes da tag <mapping-file>. Para resolver só joguei a tag class pra baixo da tag <mapping-file>. Assim:
<mapping-file>br/com/localhost8080/Teste2.hbm.xml</mapping-file>
<class>br.com.localhost8080.Teste1</class>
Caso você use a tag <jar-file> ela também deve estar depois da tag <mapping-file>
Vaaleu!
quinta-feira, 3 de março de 2011
join type not supported by OracleJoinFragment
Hoje ao usar um right join num banco oracle tive o seguinte erro:
join type not supported by OracleJoinFragment (use Oracle9iDialect/Oracle10gDialect)
Para resolver tive que trocar o hibernate.dialect do persistence.xml de:
org.hibernate.dialect.OracleDialect
para:
org.hibernate.dialect.Oracle10gDialect
Pronto, resolvido.
Adriano Schmidt
join type not supported by OracleJoinFragment (use Oracle9iDialect/Oracle10gDialect)
Para resolver tive que trocar o hibernate.dialect do persistence.xml de:
org.hibernate.dialect.OracleDialect
para:
org.hibernate.dialect.Oracle10gDialect
Pronto, resolvido.
Adriano Schmidt
terça-feira, 8 de fevereiro de 2011
SQL Server - Apparently wrong driver class specified for URL
Olá, hoje tive o seguinte erro ao iniciar o JBoss num ambiente SQL Server 2000:
15:45:18,348 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null: org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: com.microsoft.sqlserver.jdbc.SQLServerDriver, url: jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydatabase)
O problema era a URL de conexão com o banco no meu arquivo ds.xml, tirei o :microsoft
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydatabase
jdbc:sqlserver://localhost:1433;DatabaseName=mydatabase
Vaaleu!
Adriano Schmidt
15:45:18,348 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null: org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: com.microsoft.sqlserver.jdbc.SQLServerDriver, url: jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydatabase)
O problema era a URL de conexão com o banco no meu arquivo ds.xml, tirei o :microsoft
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydatabase
jdbc:sqlserver://localhost:1433;DatabaseName=mydatabase
Vaaleu!
Adriano Schmidt
sexta-feira, 4 de fevereiro de 2011
persistence.xml dinâmico
E aew!
Bom, eu defino o hibernate.dialect no persistence.xml, porém o meu persistence.xml estava dentro do meu ear.. dessa forma quando fosse necessário trocar o dialeto, era necessário alterar o ear. Eu não queria isso. Então para externalizar o hibernate.dialect tentei o seguinte:
Tirei a linha do hibernate.dialect do persistence.xml e iniciei o JBoss passando o parâmetro -Dhibernate.dialect=org.hibernate.dialect.MySQLDialect
Aconteceu o seguinte erro:
17:55:16,514 ERROR [JDBCExceptionReporter] Unexpected token: LAST_INSERT_ID in statement [select last_insert_id()]
state=Create: java.lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not retrieve generated id after insert:
[org.jboss.ejb3.timerservice.mk2.persistence.TimeoutMethod]
Bom, pra resolver isso iniciei o JBoss com um parâmetro diferente:
-Dlocalhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect
E essa propriedade eu usei no persistence.xml:
<property name="hibernate.dialect" value="${localhost8080.hibernate.dialect}"/>
Obs: Você pode trocar o localhost8080 do localhost8080.hibernate.dialect para o nome do seu projeto.
Pronto, dessa forma tudo funcionou!!!!
Também seria possível configurar o hibernate.dialect via código, mas não era esse meu objetivo.
Se você quiser colocar essa propriedade (localhost8080.hibernate.dialect) num arquivo de propriedades para que não seja necessário setá-la na inicialização do JBoss, faça o seguinte:
No arquivo properties-service.xml que fica em <jboss>\server\<context>\deploy dentro do mbean SystemProperties deve adicionar a propriedade, ficando dessa forma:
<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=SystemProperties">
<attribute name="Properties">
localhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect
</attribute>
</mbean>
Vaaaleu!
Adriano Schmidt
Bom, eu defino o hibernate.dialect no persistence.xml, porém o meu persistence.xml estava dentro do meu ear.. dessa forma quando fosse necessário trocar o dialeto, era necessário alterar o ear. Eu não queria isso. Então para externalizar o hibernate.dialect tentei o seguinte:
Tirei a linha do hibernate.dialect do persistence.xml e iniciei o JBoss passando o parâmetro -Dhibernate.dialect=org.hibernate.dialect.MySQLDialect
Aconteceu o seguinte erro:
17:55:16,514 ERROR [JDBCExceptionReporter] Unexpected token: LAST_INSERT_ID in statement [select last_insert_id()]
state=Create: java.lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not retrieve generated id after insert:
[org.jboss.ejb3.timerservice.mk2.persistence.TimeoutMethod]
Bom, pra resolver isso iniciei o JBoss com um parâmetro diferente:
-Dlocalhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect
E essa propriedade eu usei no persistence.xml:
<property name="hibernate.dialect" value="${localhost8080.hibernate.dialect}"/>
Obs: Você pode trocar o localhost8080 do localhost8080.hibernate.dialect para o nome do seu projeto.
Pronto, dessa forma tudo funcionou!!!!
Também seria possível configurar o hibernate.dialect via código, mas não era esse meu objetivo.
Se você quiser colocar essa propriedade (localhost8080.hibernate.dialect) num arquivo de propriedades para que não seja necessário setá-la na inicialização do JBoss, faça o seguinte:
No arquivo properties-service.xml que fica em <jboss>\server\<context>\deploy dentro do mbean SystemProperties deve adicionar a propriedade, ficando dessa forma:
<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=SystemProperties">
<attribute name="Properties">
localhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect
</attribute>
</mbean>
Vaaaleu!
Adriano Schmidt
quarta-feira, 22 de dezembro de 2010
@EJB não funciona
A injeção via @EJB só funciona em classes gerenciadas pelo container EJB, em outros casos é preciso fazer lookup:
Tive esse problema pois no projeto que estou agora fiz uma camada de delegates. A parte de telas do meu projeto não acessa diretamente meus serviços.. acessa um delegate que esse sim acessa meus serviços.
Como meu delegate não é uma classe gerenciada pelo container EJB tive que fazer lookup:
/////////////////
public class AaaDelegate {
private AaaService aaaService;
public AaaDelegate() {
this.aaaService = (AaaService) this.lookup(AaaService.JNDI);
}
public Object lookup(String jndi) {
try {
Context context = new InitialContext();
return context.lookup(jndi);
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
///////////////
@Local
public interface AaaService {
public static String JNDI = "aaa.AaaService";
}
/////////////
@Stateless
@LocalBinding(jndiBinding = AaaService.JNDI)
public class AaaServiceImpl implements AaaService {
}
////////////
Vaaleu!
Tive esse problema pois no projeto que estou agora fiz uma camada de delegates. A parte de telas do meu projeto não acessa diretamente meus serviços.. acessa um delegate que esse sim acessa meus serviços.
Como meu delegate não é uma classe gerenciada pelo container EJB tive que fazer lookup:
/////////////////
public class AaaDelegate {
private AaaService aaaService;
public AaaDelegate() {
this.aaaService = (AaaService) this.lookup(AaaService.JNDI);
}
public Object lookup(String jndi) {
try {
Context context = new InitialContext();
return context.lookup(jndi);
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
///////////////
@Local
public interface AaaService {
public static String JNDI = "aaa.AaaService";
}
/////////////
@Stateless
@LocalBinding(jndiBinding = AaaService.JNDI)
public class AaaServiceImpl implements AaaService {
}
////////////
Vaaleu!
Referência Cíclica EJB
Oi, hoje tive um problema de referência cíclica (cycle services dependiency ou circular references ou ainda cyclic reference) com EJBs..
Na classe AaaServiceBean eu tinha isso:
@EJB
private BbbService bbbService;
E na classe BbbServiceBean eu tinha:
@EJB
AaaService aaaService;
Isso causava um erro de referência cíclica, pois Aaa tinha um Bbb e Bbb tinha um Aaa. Para resolver isso adicionei a annotation org.jboss.ejb3.annotation.IgnoreDependency em uma das classes:
A classe AaaServiceBean ficou assim:
@EJB
@IgnoreDependency
private BbbService bbbService;
Pronto! Problema resolvido. O que esse IgnoreDependency faz exatamente eu não sei, não encontrei nenhuma documentação interessante, mas, funcionou.
Vaaleu, abraço!
Na classe AaaServiceBean eu tinha isso:
@EJB
private BbbService bbbService;
E na classe BbbServiceBean eu tinha:
@EJB
AaaService aaaService;
Isso causava um erro de referência cíclica, pois Aaa tinha um Bbb e Bbb tinha um Aaa. Para resolver isso adicionei a annotation org.jboss.ejb3.annotation.IgnoreDependency em uma das classes:
A classe AaaServiceBean ficou assim:
@EJB
@IgnoreDependency
private BbbService bbbService;
Pronto! Problema resolvido. O que esse IgnoreDependency faz exatamente eu não sei, não encontrei nenhuma documentação interessante, mas, funcionou.
Vaaleu, abraço!
HibernateException: 'hibernate.dialect'
Aconteceu comigo o erro:
Caused by: org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available
Para resolver apenas coloquei o trecho abaixo dentro da tag persistence-unit do arquivo persistence.xml:
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<properties>
Isso foi para um banco MySQL, para outros bancos segue a lista:
Mais detalhes em: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html
É isso aí!
Caused by: org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available
Para resolver apenas coloquei o trecho abaixo dentro da tag persistence-unit do arquivo persistence.xml:
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<properties>
Isso foi para um banco MySQL, para outros bancos segue a lista:
RDBMS Dialect
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
Mais detalhes em: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html
É isso aí!
persistence-unit.xml
O erro abaixo aconteceu comigo.. aconteceu pois o meu arquivo de persistência estava com o nome persistence-unit.xml, ao renomear para persistence.xml o problema parou de ocorrer.
18:23:55,912 ERROR [Ejb3Deployment] Exception while processing container metadata for EJB: TestServerBean in unit: test-ejb.jar
18:23:55,914 ERROR [AbstractKernelController] Error installing to Real: name=vfs:///C:/temp/test/jboss-6.0.0-M5/server/test-web/deploy/test-ee.ear state=PreReal mode=Manual requiredState=Real: org.jboss.deployers.spi.DeploymentException: Error deploying test-ejb.jar: Exception while processing container metadata for EJB: TestServerBean in unit: test-ejb.jar
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:189) [:6.0.0.20100911-M5]
[…]
Caused by: java.lang.IllegalArgumentException: Container jboss.j2ee:ear=test-ee.ear,jar=test-ejb.jar,name=TestServerBean,service=EJB3 failed to resolve persistence unit test
at org.jboss.injection.PersistenceUnitHandler.addPUDependency(PersistenceUnitHandler.java:135) [:1.5.1]
[…]
Caused by: java.lang.IllegalArgumentException: Can't find a persistence unit named 'test' in AbstractVFSDeploymentContext@22455058{vfs:///C:/temp/test/jboss-6.0.0-M5/server/test-web/deploy/test-ee.ear/test-ejb.jar/}
at org.jboss.jpa.resolvers.BasePersistenceUnitDependencyResolver.resolvePersistenceUnitSupplier(BasePersistenceUnitDependencyResolver.java:107) [:1.0.2-alpha-1]
18:23:55,912 ERROR [Ejb3Deployment] Exception while processing container metadata for EJB: TestServerBean in unit: test-ejb.jar
18:23:55,914 ERROR [AbstractKernelController] Error installing to Real: name=vfs:///C:/temp/test/jboss-6.0.0-M5/server/test-web/deploy/test-ee.ear state=PreReal mode=Manual requiredState=Real: org.jboss.deployers.spi.DeploymentException: Error deploying test-ejb.jar: Exception while processing container metadata for EJB: TestServerBean in unit: test-ejb.jar
at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:189) [:6.0.0.20100911-M5]
[…]
Caused by: java.lang.IllegalArgumentException: Container jboss.j2ee:ear=test-ee.ear,jar=test-ejb.jar,name=TestServerBean,service=EJB3 failed to resolve persistence unit test
at org.jboss.injection.PersistenceUnitHandler.addPUDependency(PersistenceUnitHandler.java:135) [:1.5.1]
[…]
Caused by: java.lang.IllegalArgumentException: Can't find a persistence unit named 'test' in AbstractVFSDeploymentContext@22455058{vfs:///C:/temp/test/jboss-6.0.0-M5/server/test-web/deploy/test-ee.ear/test-ejb.jar/}
at org.jboss.jpa.resolvers.BasePersistenceUnitDependencyResolver.resolvePersistenceUnitSupplier(BasePersistenceUnitDependencyResolver.java:107) [:1.0.2-alpha-1]
Assinar:
Postagens (Atom)