Hibernate - Как каскадно удалять, используя аннотации, где указаны только однонаправленные дочерние отношения - PullRequest
1 голос
/ 24 января 2010

Предположим, у меня есть две сущности: родительский объект и дочерний объект. Я хочу, чтобы у ребенка была связь с родительской сущностью и ссылка, но я не хочу, чтобы родитель знал об этом. Причина этого в том, что существует множество таких отношений, и явное указание отношений для всех этих детей будет означать постоянное обновление и загрязнение родительских объектов. Однако я все еще хочу, чтобы удаления родительского объекта каскадно пересекались с дочерним. В качестве дополнительного ограничения дочерний объект всегда имеет ссылку на родительскую сущность, устанавливая атрибут, который ссылается на идентификатор родителя. Предположим, у меня есть что-то вроде:

@Entity
class Child {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(nullable=false)
    private Long parentId;

    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    @JoinColumn(name="parentId", insertable=false, updatable=false, nullable=false, unique=false)
    private Parent parentEntity;

    // etc...

}

@Entity
class Parent {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    // etc...   
}

Тогда есть ли способ, которым удаления родительского объекта могут каскадно передаваться дочернему объекту без добавления дополнительных отношений к родительскому объекту?

Было бы предпочтительным решение, в котором используются только аннотации JPA, но любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 24 января 2010

Нет, это невозможно.

Каскадные (любые) пересекающиеся отношения. Если вы не сообщите JPA об отношениях между A и B (даже если они есть между B и A), оно не сможет автоматически пройти их.

С другой стороны: только указание родительского идентификатора, а не родительской сущности усложнит задачу. Либо Hibernate / JPA не является подходящим инструментом для того, что вы делаете, или вам нужно понять, как это работает, то есть указать и поддерживать объектные отношения.

1 голос
/ 24 января 2010

Добавление parentId вместо parent напрямую усложняет вашу жизнь. Hibernate только сохраняет идентификатор в базе данных. Так какой смысл делать это самому? Вернемся к вашей проблеме. Вы должны сделать отношение двунаправленным и добавить cascade = CascadeType.ALL к вашему дочернему атрибуту, который сам по себе является mappedBy = "parent". Это маленький, это легко, это быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...