Spring + Aspekty Dodawanie nowego obiektu i operacje na nim

0

W projekcie mam klasę Transaction, która wygląda mniej więcej tak:

public class Transaction {
	private int id;
	private String name;
	private long price;
	private Category category;
        @ManyToOne
	@JoinColumn(name = "category_id")
	private Account account;

Klasa account:

public class Account {
	int id;
	String name;
	int balance;
        @OneToMany(mappedBy="accounts")
        private Set<Transaction> transactions;

W TransactionDAO mam metodę, która zapisuje daną transakcję:

@Override
	@Transactional
	public void saveOrUpdate(Transaction transaction) {
		sessionFactory.getCurrentSession().saveOrUpdate(transaction);
	}

Problem polega na tym, że po dodaniu nowej transakcji chcę zmniejszyć stan konta (balance) o wybraną cenę z transakcji. Pomyślałem, że użyję w tym celu aspektów i stworzyłem taką metodę:

@After("execution(* saveTransaction(..)) && args(transaction,..)")
	public void method(Transaction transaction) {
		System.out.println("Wywoluje metode: " + transaction.getAccount().getName());
	}

Niestety zamiast nazwy konta wypisuje null, mimo iż w bazie danych i później w metodzie na wyświetlanie wszystko jest poprawnie połączone. Jeśli spytam o transaction.getName() wyświetla poprawnie. Coś robię źle?

1

Źle do tego podchodzisz.

  1. Łapanie aspektem metody która juz ma jakieś aspekty (w tym przypadku @Transactional) to zły pomysł, bo skąd wiesz czy złapiesz się przed czy po transactional? To może powodować różne dziwne sytuacje.
  2. To co opisujesz to część LOGIKI aplikacji i powinna byc w warstwie serwisów. Tam też zresztą powinny być założone @Transactional, a nie na DAO. Zrób odpowiedni serwis i wykonuj za jego pomocą takie złożone operacje.
  3. Nie wiem skąd pomysł żeby tą funkcjonalność realizować aspektami, to zupełnie bez sensu.
0

tak @Shalom jakieś 6-10 miesięcy temu napisał mi podobnie o AOP, (jak się go zapytałam), że AOP się do tego nie nadaje i wgl słaby pomysł (musiałam użyć AOP (polecenie z góry)).
teraz to jeden z lepszych WTFów a z biegiem czasu i zmian w kodzie 70% funkcjonalności już nie działa i nikomu nie chce się tego poprawiać zresztą nie ma czasu ;]

bo skąd wiesz czy złapiesz się przed czy po transactional? To może powodować różne dziwne sytuacje.
niby jest http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/annotation/Order.html
i w praktyce niby działa, ale jak to dokładnie działa (zakończenie i zagnieżdżanie tych advice) średnio rozumiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1