"каскадный" слушатель спящего объекта? - PullRequest
2 голосов
/ 25 февраля 2010

Использование hibernate 3.2.4.sp1 У меня есть две сущности Пользователь и ContactInfo

A User имеет связанный ContactInfo, отношение является однонаправленным, т.е. ContactInfo не имеет представления о пользователе, которому он принадлежит (и при этом он не должен использоваться в других отношениях)

Сущность User имеет прослушиватель сущностей, запрещающий другим пользователям, кроме самого пользователя, обновлять его в базе данных. Это отлично работает. Проблема в том, что один пользователь может обновить других пользователей ContactInfo. Я хотел бы включить запуск прослушивателя сущностей, когда сохранение на ContactInfo каскадно от пользователя, это возможно?

Нынешние отношения

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Cascade( { org.hibernate.annotations.CascadeType.ALL,
        org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@JoinColumn(name = "CONTACT_PERSON", nullable = false)
public ContactPerson getContactInfo() {
    return contactInfo;
}

public void setContactInfo(ContactPerson contactInfo) {
    this.contactInfo = contactInfo;
}

Текущий: слушатель сущности:

public class UserListener extends EntityListener {

    @PreUpdate
    @PrePersist
    @PreRemove
    public void checkWriteAuthorization(User user) throws IllegalUserAccessException {
        //access rules here
    }
}

Я думаю, что я ищу что-то вроде "@PreCascadeChanges"

Фактический вызов хранилища всегда находится на объекте User, а обновления каскадируются до ContactInfo

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

У меня была та же проблема, и я решил ее, применив в базовом классе сущностей жизненный цикл и указав желаемое поведение в методе onSave.

1 голос
/ 25 февраля 2010

Я хотел бы включить запуск прослушивателя сущностей, когда сохранение в ContactInfo происходит каскадно от пользователя, это возможно?

Не думаю, что вам придется выполнять свои проверки в обратных вызовах @PreUpdate, @PrePersist и @PreRemove, как в User И если вы хотите проверить, что сущность «принадлежит» какому-либо пользователю, то я думаю, что вам нужно где-то хранить эту информацию. В вашем случае я не понимаю, почему вы не можете сделать ассоциацию User-->ContactInfo двунаправленной. Вы можете уточнить?

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