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.