Hãy nói rằng chúng ta có đoạn mã sau:Giao dịch mới có tách tất cả các thực thể trước đó không?
@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?*/
//
}
}
Câu hỏi đặt ra dựa vào những nhận xét từ phương pháp cuối cùng; Tôi là curios những gì xảy ra trong cả hai trường hợp mùa xuân và trường hợp EJB. Giả sử Spring được cấu hình với các giao dịch JTA và bất kỳ phương thức nào được gọi từ lớp này sẽ bắt đầu một giao dịch mới, giống như trong EJB.
Vì vậy, trừ các loại được thiết lập để mở rộng, bên trong phương pháp đó, một người quản lý thực thể mới được tạo ra, mà không có bất kỳ cơ quan quản lý? – m3th0dman
Vâng, chính xác. Trong phương thức 'otherLogicOnUser', một giao tác mới được tạo và bối cảnh persistence không nên được nhân rộng trừ khi bạn mở rộng nó. – dcernahoschi
Sử dụng EntityManager mở rộng được thiết kế để sử dụng trong Stateful EJB, nó không phải là luồng an toàn, và các xung đột bối cảnh tồn tại có thể phát sinh nếu một phương thức sử dụng EntityManager giao dịch được gọi ra bằng cách sử dụng một EntityManager mở rộng trong cùng một giao dịch. – German