Hibernate: удалить записи из таблицы ассоциации с внешними ключами - PullRequest
0 голосов
/ 11 ноября 2010

Я новичок в спящем режиме.Итак, я не знаю, как это сделать:

У меня есть 3 таблицы:

Table Person:

@Entity
@Table(name = "ASD_PERSON")
public class AsdPerson implements Serializable {
    @Id
    @SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1)
    @GeneratedValue(generator="seq_name")
    @Column(name="F_PERSON_ID", nullable = false)
    private Long fPersonId;

    @OneToMany(mappedBy = "AsdPerson",
               cascade = CascadeType.ALL,
               orphanRemoval = true)
    private List<AsdPersonEvent> asdPersonEventList;

    ... setters and getters ...
}

Table Event:

@Entity
@Table(name = "ASD_EVENT")
public class AsdEvent implements Serializable {
    @Id
    @SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1)
    @GeneratedValue(generator="seq_name")
    @Column(name="F_EVENT_ID", nullable = false)
    private Long fEventId;

    @OneToMany(mappedBy = "AsdEvent",
               cascade = CascadeType.ALL,
               orphanRemoval = true)
    private List<AsdPersonEvent> asdPersonEventList;

    ... setters and getters ...
}

Таблица Person-Event:

@Entity
@Table(name = "ASD_PERSON_EVENT")
@IdClass(AsdPersonEventPK.class)
public class AsdPersonEvent implements Serializable {
    @Id
    @GenericGenerator(name = "generator", strategy = "foreign",
                      parameters = @Parameter(name = "property", value = "asdPerson"))
    @GeneratedValue(generator = "generator")
    @Column(name="F_PERSON_ID", nullable = false, insertable = false,
            updatable = false)
    private Long fPersonId;

    @Id
    @GenericGenerator(name = "generator", strategy = "foreign",
                      parameters = @Parameter(name = "property", value = "asdEvent"))
    @GeneratedValue(generator = "generator")
    @Column(name="F_EVENT_ID", nullable = false, insertable = false,
            updatable = false)
    private Long fEventId;

    @ManyToOne
    @JoinColumn(name = "F_PERSON_ID", insertable = false,
                updatable = false)
    private AsdPerson asdPerson;

    @ManyToOne
    @JoinColumn(name = "F_EVENT_ID", insertable = false,
                updatable = false)
    private AsdEvent asdEvent;

    ... setters and getters ...
}

Все работает отлично (добавление новых записей, создание новых объектов), за исключением случая, когда я пытаюсь удалить связанные записи из таблицы событий или таблицы Person:

...
AsdEvent ev = getService().get(115); // get record from Event table by id = 115 (for example)
ev.getAsdPersonEventList().remove(1); // delete some existing records
getService().merge(ev);
...

После этого я получаю ошибку:

удаленный объект будет повторно сохранен каскадом (удалит удаленный объект из связей): [database.AsdPersonEvent#database.AsdPersonEventPK@12908fc]

Как настроить Hibernate с аннотациями или каким-либо другим способом избавиться от этой ошибки?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Если у вас сложный график постоянных сущностей, я думаю, вам нужно отказаться от использования orphanRemoval и удалить свои сущности вручную, используя em.remove().

orphanRemoval предназначен для простых родительско-дочерних отношений, где дочерний элемент не имеет смысла без родителя. Если в вашем случае у ребенка могут быть другие отношения, возможно, это не очень хороший случай для orphanRemoval.

0 голосов
/ 11 ноября 2010

Попробуйте еще раз, удалив orphanRemoval = true

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