@ManyToOne JPA ассоциация и каскад ... не уверен, что произойдет, если я удалю объект - PullRequest
5 голосов
/ 31 мая 2011

Я до сих пор не очень понимаю, как работает каскад в операциях удаления.Мне было интересно, что произойдет, если у меня будет это:

class myBean{

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        public Cliente getClienteDiAppartenenza() {
            return clienteDiAppartenenza;
        }

}


class Cliente{
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    public List<myBean> getMyBeans() {
        return myBeans;
    }
}

, если я удалю myBean с этим свойством, я не уверен, будет ли удален связанный клиент (странно во многих файлах) или коллекция внутриКлиент будет обновлен и этот экземпляр myBean будет удален, а затем сохранен.

Что произойдет ??Документы Hibernato не очень ясно об этом ...

Ответы [ 2 ]

16 голосов
/ 31 мая 2011

Это не Hibernate, это часть стандарта JPA 2.0. У вас есть два аспекта в ваших аннотациях, во-первых, использование orphanRemoval.

Вы используете orphanRemoval, когда родительская сущность контролирует создание и уничтожение дочерней сущности. В UML это будет случай композиции, которая является сильным владельцем и согласованным сроком службы частей в целом. Спецификация JPA 2.0 в разделе 2.9: Связи сущностей гласит:

Ассоциации, которые указаны как OneToOne или OneToMany поддерживают использование опция orphanRemoval. следующие поведения применяются, когда действует orphanRemoval:

  1. Если объект, являющийся целью отношения, удаляется из отношения (установив отношение к нулю или удаление сущность из отношений сбор), операция удаления будет применяться к сущности осиротел. Операция удаления применяется во время сброса операция. СиротаУдалить функциональность предназначена для субъектов которые в частной собственности "принадлежат" их родительская сущность. Портативные приложения в противном случае не должно зависеть от конкретный порядок удаления, и должен не переназначать объект, который был осиротевший к другим отношениям или иначе попытайтесь упорствовать. Если Сирота является отдельный, новый или удаленный объект, семантика orphanRemoval не применяются.

  2. Если операция удаления применяется к объекту управляемого источника, удаление операция будет каскадно цель отношений в соответствии с правила раздела 3.2.3, (и, следовательно, не нужно указывать каскад = УДАЛИТЬ для отношения) [20].

Вторым аспектом будет использование cascase = REMOVE, если не подразумевается orphanRemoval.

Раздел 3.2.3: Удаление содержит подробную информацию о процессе удаления:

Семантика операции удаления, применяются к сущности X следующим образом:

• Если X новый объект, он игнорируется с помощью операции удаления. Тем не менее операция удаления каскадно объекты, на которые ссылается X, если Отношения от Х к этим другим лица помечены с каскад = УДАЛИТЬ или каскад = ВСЕ значение элемента аннотации.

• Если X является управляемым объектом, удаление операция вызывает его удаление. Операция удаления каскадно объекты, на которые ссылается X, если отношения от Х до этих других лица помечены с каскад = УДАЛИТЬ или каскад = ВСЕ значение элемента аннотации.

• Если X является отдельным объектом, IllegalArgumentException будет брошенный операцией удаления (или фиксация транзакции не удалась).

• Если X является удаленным объектом, это игнорируется операцией удаления.

Удаленная сущность X будет удалена из базы данных на или раньше фиксация транзакции или в результате операция смыва. После сущности был удален, его состояние (кроме для сгенерированного состояния) будет субъект в точке, в которой была вызвана операция удаления.

0 голосов
/ 31 мая 2011

Ваш провайдер JPA не собирается управлять вашими java-коллекциями в памяти для вас.Если у вас есть отношение, сопоставленное с обеих сторон, то одна сторона должна быть определена как сторона-владелец, используя атрибут mappedBy в отображении стороны, не являющейся владельцем.Вам решать, какая сторона является стороной-владельцем.Как только вы примете это решение, провайдер JPA будет постоянно обновлять информацию в базе данных, используя любое каскадное / бесхозное управление, которое вы определили в сопоставлении, но вам остается управлять своими коллекциями на стороне, не являющейся владельцем.

Один из способов справиться с этим - иметь метод обслуживания, который используется для внесения изменений, и этот метод обслуживания заботится об обновлении коллекции или ссылки на вашей стороне 1-n и n-1, так что ваш javaобъекты верны в памяти.

...