Curso de Hibernate | Características

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Entidades embebidas

Permiten definir un grupo de propiedades en una clase externa. Son útiles cuando queremos evitar consultas 1 a 1 que restarían eficiencia a nuestra aplicación.

La siguiente estructura de clases dará lugar a una única tabla en la base de datos que contendrá la suma de todos los atributo.

@Entity
public class Autor {
	...	
	@Embedded
	private Direccion direccion;
@Embeddable
public class Direccion {
	private String calle;
	private int numero;
	private int piso;
	private int puerta;

Si quieres que la entidad embebida sea además clave primaria, usaremos la etiqueta @EmbeddedID en lugar de @Embedded,

Para no tener el siguiente error, tendremos que pasarle una dirección al autor siempre que lo vayamos a salvar.

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value ...

Para evitar este error, podemos hacer que la propiedad @Embeddable y que al menos una de sus propiedades acepten valores nulos, utilizando la siguiente anotación:

@Column(nullable = true)

Claves primarias compuestas

Ejercicio

A partir de las siguientes entidades, salvar en la base de datos una sucursal y su correspondiente cuenta vinculada a dicha sucursal.

Curso de Hibernate | Características 1
@Getter @Setter
@Entity
@IdClass(CuentaSucursalPK.class)
public class Cuenta {
	@Id
	private int nCuenta;

	@Id
	@ManyToOne
	private Sucursal sucursal;

	private int saldo;
}
@Getter @Setter
public class CuentaSucursalPK implements Serializable {
	private int nCuenta;
	private Sucursal sucursal;

	@Override
	public int hashCode() {
		return Objects.hash(nCuenta, sucursal);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CuentaSucursalPK other = (CuentaSucursalPK) obj;
		return nCuenta == other.nCuenta && sucursal.getNSucursal() == other.getSucursal().getNSucursal();
	}
}

Añadir campos a una relación n-n

Crear un alumno, una asignatura, y vincularlos.

@Getter @Setter
@Entity
public class AlumnoAsignatura {
	@Id
	@GeneratedValue
	private int id;

	@ManyToOne
	@JoinColumn(name = "alumnoId")
	private Alumno alumno;

	@ManyToOne
	@JoinColumn(name = "asignaturaId")
	private Asignatura asignatura;
	
	private int horasLectivas;
}

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.