У меня есть приложение, отличное от Spring. Я хочу сделать аспект или что-то в этом роде, которое должно сделать код ниже до и после, чтобы сделать мой метод или класс транзакцией, например, аннотацией @Transactional от Spring;Как сделать «@Transactional» -подобную аннотацию с помощью АОП без пружины
До;
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("AdvancedMapping");
/* Create EntityManager */
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
После;
transaction.commit();
em.close();
Как это сделать? Где я могу найти похожие учебники или примеры?
РЕДАКТИРОВАТЬ: Кстати, это необходимо для использования внутри метода, который имеет @Transactional.
@Transactional
private int doSomething(String text) {
// Here I should have the "em" which was already taken in the aspect,
// so I can persist something in text
SomeEntityObject seo = new SomeEntityObject();
seo.setText(text);
em.persist(seo);
}
Спасибо. Как мне получить «em» внутри метода? В этом примере в методе doSomething() мне нужно «сохранить/обновить/удалить» объекты с помощью экземпляра EntityManager. –
Я могу только сказать вам, если вы покажете мне свой код. Как вы могли бы получить менеджер объектов из аннотированных методов? Это параметр? Это «это» или член «этого»? В принципе, если я знаю, как вы его получите, я могу рассказать вам, как ваш аспект может получить к нему доступ. Но я действительно рекомендую вам ознакомиться с введением AspectJ. – kriegaex
Не совсем. Сначала я подумал, что вы хотите, чтобы менеджер объектов (EM) из аннотированного метода входил в аспект. Теперь это выглядит наоборот, т. Е. Вы хотите создать экземпляр EM в этом аспекте, а затем получить доступ к нему из аннотированного метода, верно?Это также возможно, но еще один вопрос: сколько экземпляров EM вам нужно? Один за транзакцию? Один за класс с аннотированными методами? Один за приложение (singleton)? Мой ответ зависит от вашего. – kriegaex