@Entity@Table(name="tabela_1")publicclassTabela1implementsSerializable{privateTabela2Paitabela2Pai;// get and set}
Existem dois tipos de tabela 2. Tabela2_grupo1 e Tabela2_grupo2 e os dois extends Tabela2Pai e compartilham o mesmo id que está no pai.
Problema:
Ao fazer um find na minha tabela1, ele retorna normalmente o tabela2Pai com o id e o tipo da tabela(Tabela2_grupo1 ou Tabela2_grupo2).
Tem como eu fazer algum tipo de mapeamento onde ele traga os filhos a partir do pai?
Exemplo: Tabela1 tem um Tabela2Pai com id = 1 e tipoTabela = 2(Tabela2_grupo2). Gostaria então de retornar o objeto Tabela2_grupo2 e nao Tabela2_Pai.
Ao fazer um “from Pai”, ele vai retornar todos os registros (Filho1 e Filho2) como Pai, mas o tipo concreto de cada objeto vai ser Filho1 ou Filho2. Ou seja, se voce tem certeza de que todos os objetos em uma consulta sao Filho1, voce pode fazer um cast (mas dai, qual o motivo de fazer um “from Pai” ao inves de “from Filho1”?)
tiagoemerick
Sim. estou usando as tags para a herança, mas a classe pai não é abstrata.
Acontece que eu estou fazendo “from tabela_1” que tem o Tabela2Pai. Então neste momento ele faz um “from tabela2Pai” e não o especializado “from Filho1” ou “from Filho2”.
Agora ok… quando ele retorna o Pai eu consigo saber se é Filho1 ou Filho2, mas mesmo assim não é possível fazer o cast para o filho.
Tanto Filho1 quanto Filho2 tem suas especialidades.
partenon
Entao tem algo de errado Quando voce faz um “from Pai”, ele retorna uma lista com objetos Filho1 e Filho2. Voce pode fazer cast para Filho1, desde que o objeto seja realmente um Filho1.
Voce pode mostrar o codigo de suas entidades com as anotacoes de heranca, assim como o codigo que busca os registros? A excecao tb seria util
// Tarefa vem corretamentethis.tarefaJuridica=getEntityService().findById(tarefaJuridica.getId());// PS1GrupoDistribuicaogrupoDistribuicaoRespostaDestino=tarefaJuridica.getGrupoDistribuicaoRespostaDestino();if(grupoDistribuicaoRespostaDestinoinstanceofGrupoDistribuicaoExterno){// nunca entra aqui}GrupoDistribuicaoExternogde=(GrupoDistribuicaoExterno)grupoDistribuicaoRespostaDestino;System.out.println(gde.getId());/*PS1Usandoodebugeinspecionandooelemento,eleretornaoobjetoviaoproxy.OtipodoobjetoderetornoéodoPai,emboraotargetsejadofilho.Independentedissoocastdaerroemesmooinstanceofretornafalsequandoverificadoseéofilho.*/
Erro:
Exceptionduringrequestprocessing:Causedbyjavax.el.ELExceptionwithmessage:"java.lang.ClassCastException: br.com.bb.geinf.juridico.wfj.cadastrobasico.model.entity.GrupoDistribuicao_$$_javassist_3 cannot be cast to br.com.bb.geinf.juridico.wfj.cadastrobasico.model.entity.GrupoDistribuicaoExterno"org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:339)org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:280)org.jboss.el.parser.AstMethodSuffix.getValue(AstMethodSuffix.java:59)org.jboss.el.parser.AstMethodSuffix.invoke(AstMethodSuffix.java:65)org.jboss.el.parser.AstValue.invoke(AstValue.java:96)org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)org.jboss.seam.core.Expressions$2.invoke(Expressions.java:175)org.jboss.seam.navigation.Pages.callAction(Pages.java:692)org.jboss.seam.navigation.Pages.preRender(Pages.java:330)org.jboss.seam.jsf.SeamPhaseListener.preRenderPage(SeamPhaseListener.java:561)org.jboss.seam.jsf.SeamPhaseListener.beforeRenderResponse(SeamPhaseListener.java:472)org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseListener.java:148)org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.java:118)com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214)com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96)com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)br.com.bb.autorizacao.FiltroSeguranca.doFilter(FiltroSeguranca.java:222)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)java.lang.Thread.run(Thread.java:619)
Ah, agora faz mais sentido. Voce deve estar usando javassist para fazer a instrumentacao das classes, entao, ao inves de retornar um GrupoDistribuicaoInterno ou GrupoDistribuicaoExterno, ele retorna um GrupoDistribuicao instrumentado.
Ele esta instrumentando por conta do relacionamento, ou voce esta instrumentando por outro motivo? Se for por relacionamento, tenta mudar para eager ao inves de lazy, e veja se ele ainda retorna o proxy. Se ele retornar o objeto “real”, fica mais facil achar uma solucao
tiagoemerick
De fato era esse o problema mesmo!
Não sabia que por conta do proxy, ele causaria esses erros na hora do cast. :shock:
mas então… como poderia resolver, sem deixar o EAGER?
idéia?
valeu a ajuda!
partenon
Bom, depende da sua aplicacao. Como voce esta carregando os objetos? Dependendo, vc pode configurar sua query para fazer EAGER loading, mesmo que a configuracao seja LAZY. Mas se vc precisa usar isso em outras partes e tem problemas de performance em usar EAGER, entao a unica saida que vejo eh vc especificar uma interface para cada um dos dois filhos, para que o proxy implemente e vc possa fazer um cast.