Problem with OneToOne relationships in Hibernate

1

I'm learning how to use the Hibernate framework, I'm in OneToOne relationships, the problem I have is that when doing the bidirectional relationship, I miss a NullPointerException and I do not know what the failure might be.

Employee:

package com.gmail.brunodiazmartin5.hibernate.modelo;

import java.io.Serializable;
import java.time.LocalDate;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="empleados")
public class Empleado implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@Column(name="codigo")
private long codigo;

@Column(name="nombre")
private String nombre;

@Column(name="apellidos")
private String apellidos;

@Column(name="fecha_nacimiento")
private LocalDate fechaNacimiento;

@OneToOne(cascade={CascadeType.ALL})
@JoinColumn(name="id_direccion")
private Direccion direccion;


public Empleado() {}

public Empleado(Long codigo, String nombre, String apellidos, LocalDate fechaNacimiento) {
    this.codigo = codigo;
    this.nombre = nombre;
    this.apellidos = apellidos;
    this.fechaNacimiento = fechaNacimiento;
}

public long getCodigo() {
    return codigo;
}

public void setCodigo(long codigo) {
    this.codigo = codigo;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public String getApellidos() {
    return apellidos;
}

public void setApellidos(String apellidos) {
    this.apellidos = apellidos;
}

public LocalDate getFechaNacimiento() {
    return fechaNacimiento;
}

public void setFechaNacimiento(LocalDate fechaNacimiento) {
    this.fechaNacimiento = fechaNacimiento;
}



public Direccion getDireccion() {
    return direccion;
}

public void setDireccion(Direccion direccion) {
    this.direccion = direccion;
}

@Override
public String toString() {
    return "Empleado [codigo=" + codigo + ", nombre=" + nombre + ", apellidos=" + apellidos + ", fechaNacimiento="
            + fechaNacimiento + ", direccion=" + direccion + "]";
}
}

Address:

package com.gmail.brunodiazmartin5.hibernate.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;


@Entity
@Table(name="direcciones")
public class Direccion implements Serializable{

@Id
@Column(name="id")
private long id;

@Column(name="direccion")
private String direccion;

@Column(name="localidad")
private String localidad;

@Column(name="provincia")
private String provincia;

@Column(name="pais")
private String pais;

@OneToOne(mappedBy="direccion", fetch=FetchType.LAZY)
private Empleado empleado;

public Direccion() {}

public Direccion(long id, String direccion, String localidad, String provincia, String pais) {
    this.id = id;
    this.direccion = direccion;
    this.localidad = localidad;
    this.provincia = provincia;
    this.pais = pais;
}


public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getDireccion() {
    return direccion;
}

public void setDireccion(String direccion) {
    this.direccion = direccion;
}

public String getLocalidad() {
    return localidad;
}

public void setLocalidad(String localidad) {
    this.localidad = localidad;
}

public String getProvincia() {
    return provincia;
}

public void setProvincia(String provincia) {
    this.provincia = provincia;
}

public String getPais() {
    return pais;
}

public void setPais(String pais) {
    this.pais = pais;
}

public Empleado getEmpleado() {
    return empleado;
}

public void setEmpleado(Empleado empleado) {
    this.empleado = empleado;
}

@Override
public String toString() {
    return "Direccion [id=" + id + ", direccion=" + direccion + ", localidad=" + localidad + ", provincia="
            + provincia + ", pais=" + pais + ", empleado=" + empleado.getCodigo() + "]";
}
}

TestEmployee:

package com.gmail.brunodiazmartin5.hibernate.test;

import java.time.LocalDate;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.gmail.brunodiazmartin5.hibernate.modelo.Direccion;
import com.gmail.brunodiazmartin5.hibernate.modelo.Empleado;

public class TestEmpleados {

private static EntityManagerFactory emf;
private static EntityManager manager;

public static void main(String[] args) {
    //Crear el gestor de persisntecia (EM)
    emf = Persistence.createEntityManagerFactory("Persistencia");
    manager = emf.createEntityManager();

    Empleado e = new Empleado(10L, "Pepito", "Pérez", LocalDate.of(1976, 6, 6));
    e.setDireccion(new Direccion(15L, "Calle Falsa, 123", "Springfield", "Springfield", "EEUU"));

    manager.getTransaction().begin(); //Inicio la transaccion

    //Persisto (guardo) los empleados
    manager.persist(e);

    manager.getTransaction().commit(); //Finalizo la transaccion

    imprimirTodo();

    manager.close();
    emf.close();
}

@SuppressWarnings("unchecked")
private static void imprimirTodo() {
    List<Empleado> empleados = (List<Empleado>)manager.createQuery("FROM Empleado").getResultList(); //Obtengo todos los empleados
    System.out.println("Hay "+empleados.size()+" empleados en el sistema");

    empleados.forEach(System.out::println);
}
}  

Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

<persistence-unit name="Persistencia">

    <class>com.gmail.brunodiazmartin5.hibernate.modelo.Empleado</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"></property>
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"></property>
        <property name="javax.persistence.jdbc.user" value="sa"></property>
        <property name="javax.persistence.jdbc.password" value=""></property>

        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"></property>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"></property>
    </properties>
</persistence-unit>

The exception is thrown in the class Address in the toString method for some reason, the object used is null.

    
asked by bruno Diaz martin 05.09.2018 в 16:36
source

1 answer

0

I use the OneToOne relationship as follows.

Entity PROCESS:

@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
@JoinColumn(name = "ID_REQUERIMIENTO", insertable = true, updatable = true, nullable = true, unique = true)
private Requerimiento idRequerimiento;

And on the other side, in the entity REQUIREMENT:

@OneToOne(mappedBy = "idRequerimiento")
private Proceso idProceso;
    
answered by 05.09.2018 в 18:05