Ajuda JPA com Herança por subclasse.[RESOLVIDO]

5 respostas
M

Bom dia galeara, estou tendo dificuldade com Herança usando Annotations, é o seguinte tenho a classe Mãe.

@Entity
@Table(name = "funcionario", catalog = "sitransp")
@Inheritance(strategy = InheritanceType.JOINED)
public class Funcionario implements java.io.Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "idFuncionario", unique = true)
        private Integer idFuncionario;

        @OneToOne(mappedBy = "funcionario", fetch = FetchType.LAZY)
        @Cascade(CascadeType.ALL)
        @JoinColumn(name = "idUsuario",insertable = false, updatable = false)
        private Usuario usuario;

        @OneToOne(mappedBy = "funcionario")
        @Cascade(CascadeType.ALL)
        @JoinColumn(name = "idMotorista", insertable = false, updatable = false)
	private Motorista motorista;
//getters e setters

e as classes filhas,

@Entity
@Table(name = "usuario", catalog = "sitransp")
@PrimaryKeyJoinColumn(name = "Funcionario_idFuncionario")
public class Usuario extends Funcionario implements Serializable {

        /**/@OneToOne(mappedBy = "usuario", fetch = FetchType.LAZY)
        @JoinColumn(name = "idFuncionario", referencedColumnName = "idFuncionario")
	private Funcionario funcionario;
//getters e setters

e,

@Entity
@Table(name = "motorista", catalog = "sitransp")
@PrimaryKeyJoinColumn(name = "idFuncionario")
public class Motorista extends Funcionario implements Serializable {


        @OneToOne(mappedBy = "motorista", fetch = FetchType.LAZY)
        @JoinColumn(name = "idFuncionario", referencedColumnName = "idFuncionario")
        @OneToOne
	private Funcionario funcionario;
//getters e setters

eu criei uma classe teste, onde verifico se esta sendo inserido corretamente

public static void main(String[] args) {
       Session session;
//linha 35 
       session = new AnnotationConfiguration().configure(PathConfHibernate.doPath()).buildSessionFactory().openSession();
       //session = sessionFactory.openSession();
       Transaction tx = session.beginTransaction();
      
       Usuario usuario = new Usuario();
       Motorista motorista = new Motorista();
       TpUsuario tpUsuario = new TpUsuario();
       MotoristaDaoImpl motoDaoImpl = new MotoristaDaoImpl(session);
       UsuarioDaoImpl usDao= new UsuarioDaoImpl(session);
       //TipoUsuario tp = TipoUsuario.COMUM.getDesc() ;

       Departamento dep = new Departamento();
       dep.setNome("Academico");
       usuario.setNome("Ataulfo Alves");
       usuario.setMatricula(201022);

       usuario.setDepartamento(dep);
       //usuario.setTpusuario(tpUs);
       motorista.setMatricula(20100607);
       motorista.setNome("Galileu Galilei");
       motorista.setCnh(123456);
       motorista.setEmail("[email removido]");
       dep.setNome("Academico");
       motorista.setDepartamento(dep);
       
       motoDaoImpl.save(motorista);

       usDao.save(usuario);
       tx.commit();
       session.close();

contudo, quando executo a classe apresenta erro de nullpointer no relacionamento OneToOne dos mapeamentos da Herança,

Exception in thread "main" java.lang.NullPointerException
        at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
        at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
        at br.sitransp.teste.Teste.main(Teste.java:35)
Java Result: 1

alguem ai poderia dar um help!

5 Respostas

lelodois

URGENTE!!!

Ninguém aqui é pago para responder velhinho… justamente por isto o pessoal quando vê esta palavra pula o tópico :wink: (Isto lembra o meu chefe)

Não parece ser erro de hibernate, pois acredito que nem chegou a gerar a ddl, debugando o que vc ve que está nulo?

Acredito que é este…

O que ele faz?

M

Ai brother, desculpe pelo “Urgente”, mas é porque realmente é importante que eu consiga fazer isso neste FDS, e sei que ninguem aqui tem a obrigação de responder e nem é pago para isso, fazem isso porque querem ajudar aos que procurarm!
quanto ao

PathConfHibernate.doPath()

ele busca as configurações do hibernate.cgf, que estão em um pacote, dentro do src.

M

Bom dia Pessoal, consegui resolver o problema.
eu tinha errado na forma como o mapeamento esta definindo as inserções/alterações no banco.

@Entity
@Table(name = "funcionario", catalog = "sitransp")
@Inheritance(strategy = InheritanceType.JOINED)
public class Funcionario implements java.io.Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "idFuncionario", unique = true)
        private Integer idFuncionario;
        //aqui estava errado
        @OneToOne(mappedBy = "funcionario", fetch = FetchType.LAZY)
        @Cascade(CascadeType.ALL)
        private Motorista motorista;
@Entity
@Table(name = "motorista", catalog = "sitransp")
@PrimaryKeyJoinColumn(name = "idFuncionario")
public class Motorista extends Funcionario implements Serializable {

        @Column(name = "cnh")
	private Integer cnh;

        @Temporal(value = TemporalType.TIMESTAMP)
        @Column(name = "validadeCnh", length = 19)
	private Date validadeCnh;

        @OneToMany(mappedBy= "motorista", fetch = FetchType.LAZY)
	private List<Checkup> checkup;

        @OneToMany(mappedBy = "motorista", fetch = FetchType.LAZY)
	private List<SolicVeiculo> solicVeiculos;
   
        //aqui tambem estava errado
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(referencedColumnName="idFuncionario",insertable=false,updatable=false)
        @Cascade(CascadeType.ALL)
        @Fetch(FetchMode.JOIN)
        private Funcionario funcionario;

ai esta a solução.

lelodois

Coloca como resolvido :wink:

M

BLZ!

Criado 6 de agosto de 2010
Ultima resposta 8 de ago. de 2010
Respostas 5
Participantes 2