Tenho que mapear num sistema uma hierarquia de classes. Tenho a classe Acesso que é abstrata, e as classes AcessoPagina e AcessoComponente que estendem a classe abstrata.
Seguindo a documentação de referência do Hibernate, verifiquei a seguinte forma de realizar este mapeamento, criando uma tabela por classe concreta, ou seja, no meu BD exitem duas tabelas com os atributos da classe abstrata e das classes concretas.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mappingpackage="package.entity"><classname="Acesso"abstract="true"mutable="true"><cacheusage="transactional"/><idname="id"type="long"column="ID_ACESSO"><generatorclass="native"><paramname="sequence">SQ_ACESSO</param></generator></id><propertyname="msisdn"type="string"column="MSISDN"/><union-subclassname="AcessoPagina"table="MD_ACESSO_PAGINA"><propertyname="idPagina"type="long"column="ID_PAGINA"/><propertyname="idAplicacao"type="long"column="ID_APLICACAO"/><many-to-onename="idPag"class="Pagina"column="ID_PAGINA"/><many-to-onename="idAplic"class="Aplicacao"column="ID_APLICACAO"/></union-subclass><union-subclassname="AcessoComponente"table="MD_ACESSO_COMPONENTE"><propertyname="idComponente"type="long"column="ID_COMPONENTE"/><propertyname="idPagina"type="long"column="ID_PAGINA"/><many-to-onename="id"class="Componente"column="ID_COMPONENTE"/><many-to-onename="id"class="Pagina"column="ID_PAGINA"/></union-subclass></class></hibernate-mapping>
de cara já vi que o mapeamento anterior este estão diferentes… ou outro você mapeou como union-subclass e agora não.
O erro é o mesmo com este mapeamento?
De qualquer forma vou testar aqui e em 15 minutos retorno com a resposta.
A
AGAraujo
Olha só consegui reproduzir seu erro fazendo como eu disse, utilizando a propriedade e o mapeamento de ManyToOne.
Voce num poderia mandar zipado apenas estas classes e seus respectivos mapeamentos para eu ver melhor, pois não consegui reproduzir o erro de outra forma.
Mande as 5 classes envolvidas e os respectivos mapeamentos. Ai resolvemos.
Vou preparar aqui o que fiz e envio ja tb
M
maranata
AgAraujo, obrigado pela atenção.
Seguinte, são estas as classes e apenas 1 arquivo de mapeamento. No caso ele mapaeia as classes concretas, e cada classe concreta possui uma tabela no BD.
Abçs.
M
maranata
AGAraujo:
Boa cabra…
de cara já vi que o mapeamento anterior este estão diferentes… ou outro você mapeou como union-subclass e agora não.
O erro é o mesmo com este mapeamento?
De qualquer forma vou testar aqui e em 15 minutos retorno com a resposta.
Verdade. Tentei de outra forma, mas ocorre o mesmo erro.
A
arthurminarini
isso ocorre mesmo!! quanto o hibernate tem objetos que apontam para a mesma coluna vc tem que dizer qual que será persistido!! eu sempre deixo o objeto pro exemplo Pessoa como update false e insert false e crio um private Integer codPessoaPersistir;
desta forma quando eu quiser buscar a pessoa, sempre ela será carregada pelo mapeamento do objeto Pessoa e ao gravar ou atualizar seto a propriedade codPessoaPersistir
ok!!!
M
maranata
Olá arthurminarini,
Sim, mas reference-se a colunas diferentes, visto que no BD criei uma tabela para cada subclasse. Isso deveria ocorrer mesmo neste caso?
Abçs.
A
AGAraujo
Cara seguinte, meu tempo está esgotando e queria deixar isto resolvido (em retribuíção ao que o GUJ já me ajudou). Vamos lá!!
Segue as classe que eu fiz o teste para tentar simular sua situação.
Tente comparar com o que você tem. Este mapeamento cria 3 tabelas, sendo estas "TB_ACCESSPAGE", "TB_ACCESSCOMP" e "TB_PAGE".
Veja se ajuda ai.
A
AGAraujo
arthurminarini:
isso ocorre mesmo!! quanto o hibernate tem objetos que apontam para a mesma coluna vc tem que dizer qual que será persistido!! eu sempre deixo o objeto pro exemplo Pessoa como update false e insert false e crio um private Integer codPessoaPersistir;
desta forma quando eu quiser buscar a pessoa, sempre ela será carregada pelo mapeamento do objeto Pessoa e ao gravar ou atualizar seto a propriedade codPessoaPersistir
ok!!!
Boa arthur,
só complementando sua colocação: o mapeamento para um propriedade mais de uma vez só deve ser visto em casos raros, sendo que na maioria das vezes é possível contornar isto. E claro que se isto realmente ocorrer é necessário definir no mapeamento que esta propriedade somente será alterada por uma única referência (no caso, as outras ficarão com updateble=false e insertable=false).
Porém para o caso do maranata o problema está na definição da estratégia de mapeamento com hierarquia (herança).
No primeiro caso que ele definiu, utilizou uma estratégia, depois postou outra. O caso que enviei a pouco para ele é a estratégia baseada na primeira situação, que resolve sem a preocupação de ter uma propriedade mapeada mais de uma vez.
M
maranata
Muito obrigado AGAraujo e arthurminarini.
AGAraujo vou tentar aqui, mas desde agradeço imensamente a atenção. Isso é raro. Parabéns!!!
Abçs.
M
maranata
Engradaço. Infelizmente não funcionou. Numa tentativa, quebrei a hierarquia, excluindo a classe Acesso e replicando seus atributos nas classes AcessoPagina e AcessoComponente (gerando duplicação de código :oops: ). Mas foi só para teste!!! E para minha surpresa gerou EXATAMENTE o mesmo erro…
Devo estar dando alguma outra cabeçada, mas qual?
A
AGAraujo
Você já tem uma base de dados criada?
Está usando esta base de dados?
Se for manda o schema das 3 entidades (tabelas).
M
maranata
AGAraujo,
Tenho sim a base criada, a qual estou utilizando. As tabelas estão com suas respectivas FK criadas.
Segue os schemas solicitados. Mas eu criei uma tabela por subclasse. Para a classe abstrata eu não criei tabela, ok?
Seu mapeamento deve ser este que se segue. Se ainda sim não der certo, o problema está em outro lugar… tipo: arquivo de configuração duplicado, ou coisas do tipo… mas teste primeiro.
Faça somente os ajustes necessários para suas classes.
O erro é bizarro. Primeiro limpei o cache do navegador e depois do tomcat (pasta work). Não resolveu. Depois, exclui as classes Acesso, AcessoComponente e AcessoPagina da aplicação. Exclui também o arquivo de mapeamento e também a referência no arquivo de configuração do hibernate.
Supreendemente, continua a ocorrer a maledito erro!!!
Bizarro :shock:
A
arthurminarini
tente trocar para anotations tudo do zero novamente hehehe
sempre funcionou comigo usando anotations que vc pode usar um discriminador e se vc usa uma unica tabela ou não por classe
exemplo
O erro é bizarro. Primeiro limpei o cache do navegador e depois do tomcat (pasta work). Não resolveu. Depois, exclui as classes Acesso, AcessoComponente e AcessoPagina da aplicação. Exclui também o arquivo de mapeamento e também a referência no arquivo de configuração do hibernate.
Supreendemente, continua a ocorrer a maledito erro!!!
Bizarro :shock:
Brother, estou te enviando o projeto de teste de funcionamento. Pode modifica-loa vontade. Este projeto segue sua linha de raciocinio porém o banco de dados é criado em tempo de execução.
Uma outra sugestão é que você crie um projeto independente somente para seu teste sem CTRL+C e CTRL+V. O problema ai no seu é outro.
É aquele tipo de problema que “um virgula resolve atrapalhar”.
Depois posta ai qual o problema… cuidado para não mexer em coisa demais e testar e depois encontrar uma causa errada pois ai o problema pode voltar.
Outra coisa… só para divulgar uma experiência: uma vez um dos integrantes da minha equipe estava com alguns erros num projeto java do eclipse (o X vermelho) e ele tentava resolver um problema por vez, ou seja, o X vermelho continuava. Mesmo assim ele tentava realizar os testes e seja qual fosse a modificação que ele fazia não resolvia o problema e o erro continuava sempre o mesmo (por uns 2 dias). Até que eu mandei fazer um “rebuid” ai o projeto deu certo. Entendemos então que o Eclipse não recompila nada enquanto tiver o X vermelhinho. Assi, seja qual for sua modificação esta não será afetada. Estou vendo o mesmo caso na sua situação. Se encontrar alguma semelhança com isto tente da mesma maneira.
Segue o projeto para teste.
M
maranata
AGAraujo,
Cara muitíssimo obrigado. Prometo que posto a solução.