es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Boot y Hibernate no logran autocrear una tabla cuando una entidad es referenciada a sí misma.

Estoy usando spring boot y Hibernate, y tengo la siguiente entidad:

@Entity
public class SystemicLevel {

@Id
private Long id;

@Column
private String name;

@Column
private String detail;

@OneToOne
@JoinColumn(name="previous_Level")
private SystemicLevel previousSystemicLevel;
}

En el archivo application.properties establezco la propiedad spring.jpa.hibernate.ddl-auto en “create”, por lo que cuando ejecuto la aplicación obtengo este error:

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error
ejecutando DDL “alter table systemiclevel add constraint
FKehejw8ac9k3req7redt7ef4uv foreign key (previous
level) references
systemic_level (id)” via JDBC Statement

Creo que cuando Hibernate intenta crear la tabla systemiclevel, intenta hacer una referencia propia a la tabla usando la columna previouslevel, pero la tabla aún no se ha creado, por lo que lanza la excepción.

Quiero saber si existe alguna solución para este problema.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una solución para este problema. Puedes utilizar la propiedad spring.jpa.hibernate.ddl-auto para modificar el comportamiento de Hibernate al crear bases de datos. En lugar de establecerlo en “create”, configúralo en “update” para que Hibernate solo actualice el esquema basado en las clases de entidad, en lugar de recrear todo el esquema de la base de datos cada vez que la aplicación se inicie.

    Alternativamente, puedes dividir la creación del esquema de la base de datos en varios pasos. Puedes crear las tablas sin restricciones de clave externa primero y luego agregar las restricciones en un paso posterior después de que se hayan creado todas las tablas. Esto se puede hacer utilizando la anotación @PostCreate de Hibernate o un archivo de script SQL separado.

    Otra solución es utilizar la opción DeferredConstraints en Hibernate para posponer la validación de las restricciones de clave externa hasta el final de una transacción. De esta manera, Hibernate no verificará las restricciones de clave externa hasta que se hayan creado todas las tablas y evitará el error que estás experimentando actualmente.

Comments are closed.