Trong ứng dụng J2EE của chúng tôi, chúng tôi sử dụng một bean trạng thái EJB-3 để cho phép mã phía trước tạo, sửa đổi và lưu các thực thể liên tục (được quản lý thông qua JPA-2).Tại sao chúng ta phải tự xóa() EntityManager trong PersistenceContext mở rộng?
Nó trông giống như sau:
@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
private MyEntity current;
public void create()
{
this.current = new MyEntity();
em.persist(this.current);
}
public void load(Long id)
{
this.current = em.find(MyEntity.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save()
{
em.flush();
}
}
Rất quan trọng, để tránh quá sớm cam kết, chỉ có phương pháp save()
nằm trong một giao dịch, vì vậy nếu chúng ta gọi là create()
, chúng tôi chèn không có gì trong cơ sở dữ liệu.
Thật kỳ lạ, theo phương pháp save()
, chúng tôi phải gọi em.flush()
để thực sự nhấn cơ sở dữ liệu. Trong thực tế, tôi đã cố gắng và thấy rằng chúng tôi cũng có thể gọi em.isOpen()
hoặc em.getFlushMode()
, cũng bất cứ điều gì đó là "liên quan đến em".
Tôi không hiểu điểm này. Vì save()
có trong giao dịch, tôi nghĩ rằng ở cuối phương thức, giao dịch sẽ được thực hiện và do đó trình quản lý thực thể liên tục sẽ tự động bị xóa. Tại sao tôi phải tự xóa nó?
Cảm ơn, Xavier
Không cần phải 'tuôn ra() '. 'joinTransaction()' phải đủ để lưu các sửa đổi của bạn trong phương thức giao dịch của bạn. –