По умолчанию любая операция выполняется менеджером сущностей только в отношении сущности, которая предусмотрена в качестве аргумента при этой операции. Но порой, когда операция выполняется в отношении сущности, возникает необходимость распространить ее на соответствующие ассоциации. Это называется
Customer customer = new Customer("Энтони", "Балла", "[email protected]");
Address address = new Address("Ризердаун Роуд", "Лондон", "8QE", "Англия");
customer.setAddress(address);
tx.begin();
em.persist(customer);
em.persist(address);
tx.commit();
Поскольку между Customer и Address есть связь, вы могли бы каскадировать действие persist от Customer к Address. Это означало бы, что вызов em.persist(customer) привел бы к каскадированию события PERSIST к сущности Address, если она допускает распространение события такого типа. Тогда вы могли бы сократить код и избавиться от em.persist(address), как показано в листинге 6.18.
Customer customer = new Customer("Энтони", "Балла", "[email protected]");
Address address = new Address("Ризердаун Роуд", "Лондон", "8QE", "Англия");
customer.setAddress(address);
tx.begin();
em.persist(customer);
tx.commit();
Без каскадирования было бы обеспечено постоянство Customer, но не Address. Каскадирование события возможно при изменении отображения связи. У аннотаций @OneToOne, @OneToMany, @ManyToOne и @ManyToMany есть атрибут cascade, который принимает массив событий для каскадирования, а также событие PERSIST, которое можно каскадировать, как и событие REMOVE (широко используемое для выполнения каскадных удалений). Для этого вам потребуется изменить отображение сущности Customer (листинг 6.19) и добавить атрибут cascade в аннотацию @OneToOne в случае с Address.
@Entity
public class Customer {
@Id @GeneratedValue
··private Long id;
··private String firstName;
··private String lastName;
··private String email;
··@OneToOne (fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
··@JoinColumn(name = "address_fk")
··private Address address;
··// Конструкторы, геттеры, сеттеры
}
Вы можете выбирать из нескольких событий для каскадирования к цели ассоциации (эти события приведены в табл. 6.3) и даже каскадировать их все, используя тип CascadeType.ALL.
CascadeType | Описание |
---|---|
PERSIST | Каскадирует операции по обеспечению постоянства к цели ассоциации |
REMOVE | Каскадирует операции удаления к цели ассоциации |
MERGE | Каскадирует операции объединения к цели ассоциации |
REFRESH | Каскадирует операции обновления к цели ассоциации |
DETACH | Каскадирует операции отсоединения к цели ассоциации |
ALL | Объявляет, что должны быть каскадированы все предыдущие операции |
JPQL