Bom, sou novato com Hibernate mas vou tentar te ajudar!
Como você está utilizando a estratégia “JOINED”, talvez você deva utilizar a mesma @PrimaryKeyJoinColumn pra toda sua hierarquia.
Algo do tipo:
@Entity
@Table(name="pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa implements Serializable{
//implementação
}
@Entity
@Table(name = "funcionario")
@PrimaryKeyJoinColumn(name="idpessoa")
@Inheritance(strategy=InheritanceType.JOINED)
public class Funcionario extends Pessoa{
//implementação
}
@Entity
@Table(name = "dentista")
@PrimaryKeyJoinColumn(name="idpessoa")
public class Dentista extends Funcionario{
//implementação
}
Comigo deu certo! Espero que tenha ajudado!
Abraços.
Cara, eu não tinha reparado na sintaxe do SQL que você está montando e acho que talvez o problema possa estar nele.
O hibernate utiliza HQL que te possibilita montar sua queries navegando pelo seu modelo de classes (quem tem que se preocupar com o mapeamento OO/Relacional é ele e não você)! Não tem necessidade de você fazer o que você fez na consulta que está montando.
Você fez:
Quando na verdade, se você quer recuperar os dados do funcionário com base em alguns parâmetros, você deveria fazer:
Funcionario funcionario = (Funcionario) session.createQuery("SELECT f FROM Funcionario f WHERE f.nomedeusuario = :nome AND f.senha = :senha AND f.status = :status").setString("nome", "Nome do Funcionario").setString("senha", "Senha do Funcionario").setString("status", "A").uniqueResult();
Você não precisa fazer a comparação de ids entre Pessoa e Funcionario por que na verdade com o HQL você está navegando no modelo de classes, e no modelo de classes Funcionario é uma especialização de Pessoa, já contendo todas as suas propriedades.
O que está dentro do método createQuery não é SQL, é HQL, navegando dentro do modelo de classes!
Será que isso resolve seu problema?
Valeu cara! Você tinha razão!
O select que eu estava fazendo é que estava dando pala!
Na verdade postei aqui uma versão antiga do que realmente fazia… Quero dizer, o select que postei tinha um join que não preciso…
Eu tinha usado SQL bruto no codigo Java por facilidade de não precisar aprender HQL ou outra coisa… Só que, realmente fica feio pra caramba!
Misturar SQL com código Java não é uma boa opção…
Num fim das contas, usei criteria que, na minha opinião, deixa o código bem “mais bonito”…
session = HibernateUtil.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Funcionario.class);
criteria.add(Restrictions.eq("nomeDeUsuario", funcionario.getNomeDeUsuario()));
criteria.add(Restrictions.eq("senha", funcionario.getSenha()));
criteria.add(Restrictions.eq("status", "A"));
List resultado = criteria.list();
Funcionario out = null;
if (resultado.size() > 0) {
out = (Funcionario) resultado.get(0);
}
Mais uma vez, valeu pela ajuda!
marcelo.bellissimo,
Valeu! Mas, o link que você postou não trata o que eu precisava. Ele fala sobre mapeamento de relacionamento N x N…