Hibernate delete objects on cascade

后端 未结 2 1386
余生分开走
余生分开走 2021-01-19 11:26

I\'m sligthly confused as to how the cascade=\"delete\" works. I defined the mapping in the following way in the City mapping file:



        
2条回答
  •  抹茶落季
    2021-01-19 12:15

    I'm slightly confused as to how the cascade="delete" works (...)

    Cascading a delete operation means that if you delete a parent, the operation will be propagated along the association. So in your case, deleting a City entity should be propagated to the Clients.

    So when I run (...) Should all the clients be deleted as well

    The Session#delete(String) method that takes a HQL query string, executes it, iterates over the results and calls Session#delete(Object) on each object respect cascading (so the Clients will be deleted if your query is really a HQL query).

    But this method is old and has been deprecated in Hibernate 3 (and moved to the "classic" Session interface), I do not really recommend it (it performs 1+N operations and is pretty inefficient to delete a huge number of results).

    If this is a concern, prefer the bulk delete support offered by Hibernate:

    int deleteCount = session.createQuery("delete from Foo where bar = :bar") 
        .setParameter("bar", bar);
        .executeUpdate()
    

    But note that bulk delete has restrictions:

    • You can not use aliases.
    • No inner joins in the query (although you can use subselects in the where clause).
    • A bulk delete does not cascade (and won't take care of join tables).

    So with a bulk delete, you'd have to delete the Client before the City. But performances are much better.

    PS: You need to commit() at some point (and also improve your error handling i.e. rollback() in the catch block)

    References

    • Hibernate Core Reference Guide
      • 14.4. DML-style operations

提交回复
热议问题