Hibernate Not-Null Property References a Null or Transient Value

El mensaje de error «Not-Null Property References a Null or Transient Value» es un error común en Hibernate. Ocurre cuando Hibernate intenta guardar una entidad con una propiedad marcada como no nula, pero el valor de esa propiedad es nulo o un objeto transitorio que aún no se ha guardado.

Causas del error

El error «Not-Null Property References a Null or Transient Value» en Hibernate puede ocurrir en los siguientes escenarios:

  1. Una causa común de este error es asignar nulo a una columna marcada con nullable = false. En Hibernate, cuando una propiedad está marcada como no nula en el esquema de la base de datos, significa que no puede tener un valor nulo. Sin embargo, si intenta asignar un valor nulo a dicha propiedad, Hibernate arrojará el error «Not-Null Property References a Null or Transient Value«.
  2. Otra causa de este error es guardar una entidad con una asociación que hace referencia a una instancia no guardada. En Hibernate, cuando tiene una asociación entre dos entidades, es importante asegurarse de que ambas entidades se guarden antes de establecer la asociación. Si intenta guardar una entidad con una asociación a una instancia no guardada, Hibernate generará el error «Not-Null Property References a Null or Transient Value«.

Asignar null a una columna marcada con nullable = false

Si intenta guardar una entidad con un valor nulo en una columna marcada como no anulable, Hibernate generará una PropertyValueException. Para ejemplificar usaremos una tabla de clientes con la siguiente estructura:

Hibernate Not-Null property-table

Para forzar la verificación de nulidad en Hibernate, puede usar la anotación @Column(nullable = false). Esta anotación le dice a Hibernate que la columna correspondiente no debe aceptar valores nulos. Si intenta guardar una entidad con un valor nulo para esta columna, Hibernate generará la PropertyValueException. En la entidad que corresponde a la tabla antes mencionada, marcaremos a la columna ADDRESS como no nulable:

@Table(name="CUSTOMERS")
@Entity(name="customer")
public class Customer {

	@Id
	@Column(name = "CUSTOMER_ID")
	private int customerId;

	@Column(name = "LAST_NAME")
	private String lastName;

	@Column(name = "FIRST_NAME")
	private String firstName;

	@Column(name = "ADDRESS", nullable = false)
	private String address;

	@Column(name = "CITY")
	private String city;

	//getters & setters
}

En la clase principal creamos una nueva instancia de la entidad a fin de persistirla en la base de datos, dejando la propiedad address sin asignar para verificar que se está lanzando una PropertyValueException.

public class HbmExample {
    public static void main( String[] args ) {
		EntityManagerFactory emf = null;
		EntityManager entityManager = null;
        
		try {
			emf = Persistence.createEntityManagerFactory("standalone-sample");
			entityManager = emf.createEntityManager();
			
			entityManager.getTransaction().begin();
			
			Customer c = new Customer();
			c.setFirstName("JOHN");
			c.setLastName("S");
			c.setCity("CHICAGO");
			
			entityManager.persist(c);
			
			entityManager.getTransaction().commit();
		} catch(Exception e) {
			System.out.println("-> " + e.toString());
		}
    }
}

Al finalizar la ejecución podemos ver el output en la consola:

Hibernate Not-Null property-console

Guardar una entidad con una asociación que hace referencia a una instancia no guardada

Otro escenario donde puede ocurrir este error es cuando intenta guardar una entidad que tiene una asociación con otra entidad que aún no se ha guardado. Hibernate requiere que la entidad asociada se guarde antes que la entidad de referencia para garantizar la integridad de los datos. Si intenta guardar la entidad de referencia antes de guardar la entidad asociada, Hibernate generará la PropertyValueException.

Soluciones

Para corregir este error, puede considerar las siguientes soluciones:

  • Asegúrese de proporcionar valores válidos para todas las propiedades marcadas como no nulas en su entidad.
  • Si está guardando una entidad con asociaciones, asegúrese de que las entidades asociadas se guarden antes de guardar la entidad de referencia.
  • Verifique sus asignaciones y asegúrese de que las asociaciones estén definidas correctamente.
  • Si está utilizando la anotación @Column(nullable = false), asegúrese de no intentar guardar valores nulos para las columnas correspondientes.

Conclusión

En conclusión, es fundamental comprender y solucionar el error «Not-Null Property References a Null or Transient Value» en Hibernate. Al implementar las soluciones analizadas en este artículo, evitará problemas de integridad de datos y garantizar el buen funcionamiento de sus aplicaciones.

Para obtener más información, puede consultar la documentación de Hibernate y explorar recursos adicionales sobre cómo administrar asociaciones de entidades y manejar valores nulos.


Te puede interesar