Интересный вопрос АОП по сквозной проблеме? - PullRequest
2 голосов
/ 06 октября 2009

Рассмотрим набор DOA с методами, подобными этому

public void addObject(Long sessionId, Long clientId, Dom obj){...}

Теперь у каждого домена pojo (Dom) есть свойство sessionId, и для каждой вставки, обновления или удаления объекта домена sessionId должно быть передано с setSessionId(Long sessionId), чтобы мы могли знать, кто что делает. Но, похоже, это затрагивает все аспекты доступа к данным, которые, как мне кажется, AOP были бы хорошим инструментом для вставки sessionId в @Before(JoinPoint) или @Around(ProceedingJoinPoint) рекомендации. Это реально возможно? DAO в основном Hibernate с несколькими Spring StoredProcedure.

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Я не понимаю, почему вы не можете сделать это, я действительно делал что-то подобное (немного более сложное) в прошлом, помог мне не проводить перекрестный рефакторинг каждого класса!

Думали ли вы поставить public void addObject (Long sessionId, Long clientId, Dom obj) {...} в классе отца / высшего уровня? Этот метод может делегировать каждую реализацию.

1 голос
/ 08 октября 2009

Ваш параметр sessionId, по-видимому, относится к аспекту аудита . В Hibernate этот аспект аудита обычно реализуется в реализации org.hibernate.Interceptor .

Вы можете реализовать множество методов, соответствующих событию жизненного цикла, для ваших сущностей и запросов. В вашей реализации легко получить доступ к вашему текущему sessionId (он может использовать переменную ThreadLocal). Ясно и чисто, быстро; -)

Это, вероятно, проще, чем делать это самостоятельно с AOP, особенно если вы получаете обратные вызовы из Hibernate для событий жизненного цикла.

1 голос
/ 06 октября 2009

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

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

...