Search code examples
javahql

Delete all slaves with an object in HQL


I use following HQL query to delete a specific object in my database.

delete from com.ranking.Footballclub where id = 1

The problem I encounter when I do this, it breaks a foreign key.

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The DELETE statement conflicted with the REFERENCE constraint "FK_VKLC3OLNFZIT2FCYMMKDO2ERZ4". The conflict occurred in database "sports", table "dbo.FOOTBALL_PLAYER", column 'CLUB_ID'

A sport teams has a slave of players. I could first delete all players before I delete the Footballclub. But a Footballclub has more than just players. It has for example a list of employees, transfers,... Their foreign keys will break as well.

For this case I'm looking for something in HQL to delete all slave fields in 1 statement.


Solution

  • you can set the ON DELETE CASCADE in the data base explicitly, or mark the required Child entity with the annotation @org.hibernate.annotations.OnDelete.

    It will automatically adds the on delete to schema during the schema generation. like -

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "YOUR_PARENT", 
                cascade = CascadeType.REMOVE)    
     @org.hibernate.annotations.OnDelete(
                action = @org.hibernate.annotations.OnDeleteAction.CASCADE)
     private List<YOUR_CHILD> CHILDS;