Powiedzmy mamy następujący fragment kodu:Czy nowa transakcja odrywa wszystkie poprzednie jednostki?
@Entity
public class User {
@Id
private String name;
@OneToOne(cascade = CascadeType.ALL)
private Address address;
//getters and setters
}
@Entity
public class Address {
@Id
private int id;
private String street;
//getters and setters
}
@Stateless
//@Service
public class UserLogicClass {
@PersistenceContext
//@Autowired
private EntityManager entityManager;
public void logicOnUser(User user) {
if(logicOnAddress(user.getAddress()) {
otherLogicOnUser(user);
}
}
public boolean logicOnAddress(Address address) {
//
entityManager.find(address);//address becomes managed
//
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
//@Transactional(propagation = Propagation.REQUIRES_NEW)
public void otherLogicOnUser
//
entityManager.find(user);/*without annotation, user is not managed and address is managed, but with the transaction annotation is the address still managed?*/
//
}
}
Kwestia polega na komentarz z ostatniej metody; Jestem ciekawostką, co dzieje się w przypadku Spring i EJB. Załóżmy, że Spring jest skonfigurowany z transakcjami JTA i każda metoda wywołana z tej klasy rozpocznie nową transakcję, tak jak w EJB.
Więc jeśli typ jest ustawiony na rozszerzony, wewnątrz tej metody, nowa jednostka jest tworzona menedżer, który nie ma żadnych zarządzanych podmiotów? – m3th0dman
Tak, dokładnie. W metodzie 'otherLogicOnUser' tworzona jest nowa transakcja, a kontekst utrwalania nie powinien być propagowany, chyba że zostanie przedłużony. – dcernahoschi
Użycie rozszerzonego EntityManager zostało zaprojektowane do użycia w Stateful EJB, nie jest bezpieczne dla wątków, a kolizje kontekstu utrwalania mogą powstać, jeśli metoda używająca EntityManager o zakresie transakcji wywołuje metodę przy użyciu rozszerzonego EntityManager w tej samej transakcji. – German