Hibernate Одитируемые отношения многие ко многим - PullRequest
1 голос
/ 06 мая 2009

Рассмотрим следующую конфигурацию гибернации:

<class name="Person">
<id name="id" column="personId">
    <generator class="native"/>
</id>
<set name="addresses" table="PersonAddress">
    <key column="personId"/>
    <many-to-many column="addressId"
        class="Address"/>
</set>
</class>

<class name="Address">
<id name="id" column="addressId">
    <generator class="native"/>
</id>
<set name="people" inverse="true" table="PersonAddress">
    <key column="addressId"/>
    <many-to-many column="personId"
        class="Person"/>
</set>
</class>

Теперь эти два класса (Персона и Адрес) имеют интерфейс Auditable. В нашем классе Hibernate AuditInterceptor (реализует Interceptor) мы выполняем некоторую функцию аудита, если сущность является экземпляром Auditable. Короче говоря, весь этот код прекрасно работает ...

Тем не менее, есть эта таблица PersonAddress, которая не подвергается аудиту, потому что у нас технически нет POJO для нее ... поэтому мы не можем проверить наличие "instanceof". Есть ли способ в конфигурации гибернации, что мы можем сказать ему Перехватить эту таблицу PersonAddress? Может быть, нам нужно обработать одно из других действий от Перехватчика (например, onCollectionUpdate). Я не уверен ...

Единственный другой способ заставить его выполнить Audit - преобразовать отношение один-ко-многим из Person в PersonAddress, один-ко-многим из Address в PersonAddress и создать еще один элемент класса для PersonAddress, который выполняет сопоставления "многие-к-одному" обратно на Персона и Адрес.

Это похоже на дополнительную работу, и я действительно хочу избежать дополнительной работы.

Может кто-нибудь предложить лучшее решение?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2009

Я не мог понять это с помощью сопоставлений «многие ко многим», поэтому я преобразовал это отображение в «один ко многим» и создал модельный компонент для PersonAddress с соответствующими отображениями гибернации.

Спасибо!

0 голосов
/ 06 мая 2009

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

Если это так, то следует ли проводить аудит как часть проверки личности или адреса.

Например, лично:

class Person {
    private List<Address> addedAddresses;
    private Set<Address> addresses;
    .
    .
    .
    public void addAddress(Address toAdd) {
        addedAddresses.add(toAdd);
        addresses.add(toAdd);
    }
}

Затем при аудите Person запишите записи, записанные в addAddresses, если он не пустой.

Конечно, это довольно просто (что делать с удалениями? С изменениями адресов?), Но в вашем примере больше ничего не происходит.

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