In enterprise applications, managing relationships between entities is critical.
Spring Cascade defines how operations on a parent entity propagate to child entities within Hibernate.
@Entity
public class Order {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> items;
}
| Type | Description |
|---|---|
| PERSIST | Save child when parent is saved |
| MERGE | Update child when parent is updated |
| REMOVE | Delete child when parent is deleted |
| REFRESH | Reload from DB |
| DETACH | Detach from context |
| ALL | All operations |
Order.save() ↓ Hibernate checks cascade ↓ Saves Order ↓ Saves OrderItems
Database Cascade is defined using foreign key constraints.
CREATE TABLE order_item (
id BIGINT PRIMARY KEY,
order_id BIGINT,
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE
);
DELETE FROM orders WHERE id = 1 ↓ DB detects FK constraint ↓ Deletes order_items
| Feature | Spring Cascade | DB Cascade |
|---|---|---|
| Layer | Application | Database |
| Trigger | JPA | SQL |
| Performance | Moderate | High |
| Control | High | Limited |
| Works without app | No | Yes |
orderRepository.delete(order);
DELETE FROM orders WHERE id = 1;
Use Spring for persist/merge and DB for delete with caution.
Spring Cascade:
Java → Hibernate → DB
DB Cascade:
SQL → Database → Auto propagation