- Transakcje na poziomie DAO to zwykle zło. Jakbyś to napisał po ludzku, czyli transakcje miał na poziomie serwisu to w ogóle nie byłoby kłopotu.
- Jeśli mimo to wyciągasz obiekt "poza" transakcje to jest odpięty od bazy danych automatycznie i musisz go znowu powiązać przez load
- W trakcie kiedy obiekt jest powiązany z sesją bazy danych nie trzeba robić żadnych save, bo wszystkie zmiany automatycznie są wprowadzane. Jest to też pewne ryzyko, bo możesz sobie tak przypadkiem coś z bazy skasować jeśli "bawisz się" obiektem pobranym z bazy przy aktywnej sesji!
Drążę jeszcze temat żeby dobrze zrozumieć, (pomińmy to że kod jest nie "elegancki" i transakcja nie jest we właściwej warstwie) np coś takiego, w pliku konfiguracyjnym mam entityManager z entityManagerFactory:
@Bean
public EntityManager entityManager(){
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
EntityManager em = entityManagerFactory.createEntityManager();
return em;
}
@Bean("ordersDao")
public OrdersDao orders() {
return new OrdersDao();
}
@Autowired
private EntityManager em;
public Orders load(Long id) {
Orders order = null;
em.getTransaction().begin();
order = em.find(Orders.class, 1L);
em.getTransaction().commit();
return order;
}
public void save(Orders aggregate) {
em.getTransaction().begin();
em.persist(aggregate);
em.getTransaction().commit();
}
I w Main.java
Orders order = ordersDao.load(1L);
order.setName("name");
ordersDao.save(order);
to działa dlaczego nie działa z to samo z użyciem @Transactional? Chyba że to nie jest to samo? Czym się różni?
Taki efekt deatached otrzymuje dopiero w tej sytuacji:
public void save(Orders aggregate) {
em.getTransaction().begin();
em.clear(); // Odłączam zarządzanie encją
em.persist(aggregate);
em.getTransaction().commit();
}
Otrzymuje:
PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:
I tu sprawa jest jasna widze to, czy to oznacza że po @Transactional jest clear entityManagera? Czym to się różni?