Lassen Sie uns sagen, dass wir das folgende Stück Code haben:Entfernt eine neue Transaktion alle vorherigen Entitäten?
@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?*/
//
}
}
Die Frage beruht im Kommentar aus dem letzten Verfahren; Ich bin neugierig, was passiert, sowohl in Spring Fall und EJB Fall. Angenommen, Spring ist mit JTA-Transaktionen konfiguriert und jede Methode, die von dieser Klasse aufgerufen wird, startet eine neue Transaktion, genau wie in EJB.
Also, wenn der Typ erweitert festgelegt ist, innerhalb dieser Methode, eine neue Entität Manager erstellt wird, das hat keine verwalteten Einheiten? – m3th0dman
Ja, genau. In der 'otherLogicOnUser'-Methode wird eine neue Transaktion erstellt und der Persistenzkontext sollte nicht weitergegeben werden, solange Sie ihn nicht erweitern. – dcernahoschi
Die Verwendung eines erweiterten EntityManagers wurde für die Verwendung in Stateful EJBs entwickelt, ist nicht threadsicher und Konflikte im Persistenzkontext können auftreten, wenn eine Methode mit einem transaktionsbereichsbezogenen EntityManager eine Methode mit einem erweiterten EntityManager in derselben Transaktion aufruft. – German