Поведение JPA ORM двух сущностей с различным параметром CascadeType? - PullRequest
1 голос
/ 20 августа 2011

У меня есть вопрос относительно сопоставления JPA OR между двумя постоянными сущностями с другим параметром CascadeType в их аннотациях.

Чтобы прояснить ситуацию, вот простой пример:

@Entity
public class Article
{
    @Id
    @GeneratedValue
    private Long    id;

    @ManyToOne( cascade = CascadeType.ALL )
    private Author  author;

    // Getters and Setters follow here
}

_

@Entity
public class Author
{
    @Id
    @GeneratedValue
    private Long            id;

    @OneToMany( mappedBy = "author", cascade = CascadeType.REFRESH, 
        orphanRemoval = true )
    private List< Article > articles;

    // Getters and Setters follow here
}

Как видите, свойство "author" имеет другой набор CascadeType (CascadeType.REFRESH), затем свойство "Articles" (CascadeType.ALL). Сначала я подумал, что другой CascadeType для того же сопоставления свойств недопустим, но я попробовал это сделать, и это разрешено.

Теперь я хотел бы знать, как это ведет себя? И имеет ли такой (искусственный) пример какой-либо смысл (как вы видите, это скорее теоретический вопрос)?

Большое спасибо за вашу помощь!

1 Ответ

3 голосов
/ 20 августа 2011

cascade = CascadeType.XXX означает: когда вы выполняете операцию XXX для этого объекта, автоматически выполняете ту же операцию XXX для объекта (объектов), на который ссылается ассоциация.

Таким образом, в вашем случае, если вы сохраните / объедините / удалите статью, она также сохранит / объединит / удалит своего автора. Это очень сомнительно. Я не думаю, что вы действительно этого хотите.

И когда вы обновите автора, он также обновит свои статьи.

Обратите внимание, что если вы обновите статью, она обновит своего автора (из-за CascadeType.ALL), и поскольку автор формы связи со статьями также имеет каскадный тип REFRESH, он также обновит все статьи автора.

...