Annotation Interface OnDelete


@Target({METHOD,FIELD,TYPE}) @Retention(RUNTIME) public @interface OnDelete
Specifies an on delete action for a foreign key constraint. The most common usage is @OnDelete(action = CASCADE).
 @ManyToOne
 @OnDelete(action = CASCADE)
 Parent parent;
 
This code results in an on delete cascade clause in the DDL definition of the foreign key.

The @OnDelete annotation may be applied to any field or property representing an association or collection, or to a subclass in a joined inheritance hierarchy.

 @Entity
 @Inheritance(strategy = JOINED)
 class Publication {
     @Id
     long id;
     ...
     @ElementCollection
     @OnDelete(action = CASCADE)
     String<String> keywords;
 }

 @Entity
 @OnDelete(action = CASCADE)
 class Book extends Publication {
     @Column(unique = true);
     String isbn;
     ...
     @ManyToMany
     @OnDelete(action = CASCADE)
     Set<Author> authors;
 }
 

The affect of @OnDelete(action = CASCADE) is quite different to CascadeType.REMOVE. It's more efficient to delete a row via on delete cascade, but there's a catch. Like database triggers, on delete actions can cause state held in memory to lose synchronization with the database. In particular, when an entity instance is deleted via on delete cascade, the instance might not be removed from the second-level cache.

To alleviate this problem, @OnDelete may be used together with cascade=REMOVE.

 @OneToMany(mappedBy = Child_.parent, cascade = {PERSIST, REMOVE})
 @OnDelete(action = CASCADE)
 Set<Child> children = new HashSetinvalid input: '<'>();
 
This mapping looks redundant, but it's not.
  • If @OnDelete(action = CASCADE) is used in conjunction with cascade=REMOVE, then associated entities are fetched from the database, marked deleted in the persistence context, and evicted from the second-level cache.
  • If @OnDelete(action = CASCADE) is used on its own, without cascade=REMOVE, then associated entities are not fetched from the database, are not marked deleted in the persistence context, and are not automatically evicted from the second-level cache.

Other options such as OnDeleteAction.SET_NULL and OnDeleteAction.SET_DEFAULT are much less commonly used. Note that @OnDelete(SET_DEFAULT) should be used together with @ColumnDefault.

 @ManyToOne
 @OnDelete(action = OnDeleteAction.SET_DEFAULT)
 @ColumnDefault("-1")
 Parent parent;
 
  • Required Element Summary

    Required Elements
    Modifier and Type
    Required Element
    Description
    The action to taken by the database when deletion of a row would cause the constraint to be violated.
  • Element Details

    • action

      The action to taken by the database when deletion of a row would cause the constraint to be violated.