2012-09-08 2 views
0

Я работаю над весной, спящий проект и база данных - оракул. У меня есть слой DAO для операций, связанных с сохранением.Spring AOP для работы с базой данных

Во всех моих таблицах у меня есть create_date и update_date столбцы, представляющие метку времени, когда строка вставлена ​​и обновлена ​​в таблицах соответственно.

Существует требование, чтобы я обновил вышеупомянутые два столбца временной метки той конкретной таблицы, для которой запрос предназначен для всякой операции вставки/обновления. Например, если мой слой DAO имеет два метода, скажем, м1 и м2, что отвечает за влияние на таблицы t1 и t2 соответственно. Теперь, если вызывается метод m1, тогда будут обновлены столбцы временной таблицы таблицы t1. Для вставки колонка create_date будет обновлена, и для любого обновления будет обновляться столбец update_date.

У меня есть идея Spring AOP, поэтому я думал использовать AOP для реализации вышеуказанного требования, хотя я не совсем уверен, что его можно достичь с помощью АОП.

Пожалуйста, дайте мне знать, если я смогу использовать АОП для выполнения этого требования. И если это возможно, то, пожалуйста, предоставьте мне информацию о том, как его реализовать.

ответ

0

Это должно быть возможно с помощью пружинного АОП с использованием совета @Before. Если вы передаете сущность методу создания, укажите совет create_date и для метода обновления update_date. Вы можете рассмотреть следующие действия, чтобы сделать вашу работу проще:

  • Есть все юридические лица осуществлять общий интерфейс для установки create_date и update_date. Это позволяет вам иметь общий совет, не прибегая к размышлениям.
  • Имейте соглашение об именах, чтобы идентифицировать методы создания и обновления наших DAO. Это упростит ваши точки.
+0

Но, как я узнать, какие таблицы должны это произойти? – Anand

+0

Ты сказал, что это для всех твоих столов. –

+0

Я хочу сказать, что в моем слое DAO, скажем, у меня есть два метода, скажем, m1 и m2, влияющие на таблицы t1 и t2 соответственно. Теперь предположим, что метод m1 вызывается, тогда будет вызываться мой аспект, который будет отвечать за обновление столбцов метки времени. Но как мой аспект узнает, в какой таблице он должен работать? В этом случае он должен обновить таблицу t1. – Anand

1

Вместо этого я бы использовал перехватчик Hibernate, вот для чего они предназначены. Например, объекты, которые нуждаются в таких областях могут реализовать следующий интерфейс:

public interface Auditable { 
    Date getCreated(); 
    void setCreated(Date created); 
    Date getModified(); 
    void setModified(Date modified); 
} 

Тогда перехватчик всегда задает модифицированное поле на сохранение, и только устанавливает созданное поле, когда он еще не установлен.

0

Даже если вы просите решение Spring AOP на свой вопрос, я хотел бы указать, что тот же результат может быть достигнут с помощью триггеров базы данных, e. г. автоматически устанавливая отметку времени created во время INSERT операций и modified временную метку во время UPDATE утверждений.

Это может быть хорошим решением, особенно если не все ваши вызовы БД проходят через AOP-захваченную логику (например, если вы обходите определение pointcut, потому что метод не соответствует шаблону или даже полностью обходит код, используя автономный SQL client), чтобы вы могли применять модифицированную метку времени, даже когда кто-то обновляет записи из другого приложения.

У этого был бы недостаток, который вам нужно определить триггеры для всех затронутых таблиц.

3

Я применил функцию даты обновления для одного из модулей в моем приложении, используя Spring AOP. Код PFB для вашей справки

Надеюсь, это поможет. Интересно, если один может иметь для переменной срезов в качестве well.I знать его не может возможно с весны аспект J implementation.But любую работу вокруг парней: P

** 
    * @author Vikas.Chowdhury 
    * @version $Revision$ Last changed by $Author$ on $Date$ as $Revision$ 
    */ 
    @Aspect 
    @Component 
public class UpdateDateAspect 
{ 
    @Autowired 
    private ISurveyService surveyService; 

    Integer surveyId = null; 

    Logger gtLogger = Logger.getLogger(this.getClass().getName()); 

    @Pointcut("execution(* com.xyz.service.impl.*.saveSurvey*(..)))") 
    public void updateDate() 
    { 

    } 

    @Around("updateDate()") 
    public Object myAspect(final ProceedingJoinPoint pjp) 
    { 

     // retrieve the runtime method arguments (dynamic) 
     Object returnVal = null; 
     for (final Object argument : pjp.getArgs()) 
     { 

      if (argument instanceof SurveyHelper) 
      { 
       SurveyHelper surveyHelper = (SurveyHelper) argument; 
       surveyId = surveyHelper.getSurveyId(); 

      } 

     } 
     try 
     { 
      returnVal = pjp.proceed(); 
     } 
     catch (Throwable e) 
     { 
      gtLogger.debug("Unable to use JointPoint :("); 
     } 
     return returnVal; 
    } 

    @After("updateDate()") 
    public void updateSurveyDateBySurveyId() throws Exception 
    { 
     if (surveyId != null) 
     { 
      surveyService.updateSurveyDateBySurveyId(surveyId); 
     } 
    } 
} 
Смежные вопросы