2011-12-16 35 views
5

Tài liệu cho EntityManager.persist() nói rằng nó sẽ .EntityManager.contains() trả về false sau khi vẫn tồn tại()

Đó là sự kiên trì của thực thể đối với cơ sở dữ liệu, nhưng khi tôi gọi phương thức EntityManager.contains() để kiểm tra xem thực thể mà tôi chỉ tồn tại được quản lý thì trả về false.

Tôi chỉ muốn biết tại sao điều này lại xảy ra? Có lẽ có những điều mà tôi không thể làm hoặc điều gì đó mà tôi bỏ qua?

Đề xuất sẽ được đánh giá cao: D

+1

Bạn có thể đăng mã mà bạn vẫn tồn tại và đọc nội dung của EntityManager không? –

Trả lời

3

Điều đó thật kỳ lạ. Theo các các Sun EJB3 spec:

Phương pháp thể được sử dụng để xác định xem một thực thể dụ được quản lý trong bối cảnh kiên trì hiện hành.

Phương pháp contains trả về true:

  • Nếu đơn vị đã được lấy ra từ cơ sở dữ liệu, và chưa được gỡ bỏ hoặc tách ra.
  • Nếu thể hiện thực thể mới và phương thức persist đã được gọi trên thực thể hoặc hoạt động vẫn tồn tại đã được xếp chồng lên nó.

Phương pháp contains trả về false:

  • Nếu dụ được tách ra.
  • Nếu phương pháp remove đã được gọi trên thực thể hoặc thao tác xóa đã được xếp chồng lên nó.
  • Nếu phiên bản mới, và phương thức persist chưa được gọi trên thực thể hoặc hoạt động tồn tại chưa được xếp chồng lên nó.

Lưu ý rằng tác động của các tầng của tồn tại hoặc loại bỏ là ngay lập tức nhìn thấy được bằng chứa phương pháp, trong khi chèn thực tế hoặc xóa các đại diện cơ sở dữ liệu cho các thực thể có thể được hoãn lại cho đến khi kết thúc giao dịch .

Bạn có đang gọi số contains trong cùng một giao dịch không?

+0

Tôi tin rằng tôi đang ở trong cùng một giao dịch nhưng tôi không thực sự chắc chắn vì tôi không xác định nơi giao dịch nên bắt đầu và cam kết vì tôi đã để điều đó cho vùng chứa. Nhưng tôi nghĩ tại sao tôi không nhận được thực thể kiên trì là vì khóa chính. Một trong những khóa chính nên đến từ cơ sở dữ liệu và tôi không thể lấy lại. Dù sao, tôi sẽ chỉ thử một cách tiếp cận khác để hoàn thành công việc này. Cảm ơn thông tin mặc dù: D –

0

chúng tôi đã làm một số cách giải quyết, thay vì lưu giữ lại> làm mới, chúng tôi vừa lấy khóa tự động từ kho dữ liệu và gán nó theo cách thủ công cho các trường khóa của tổ chức và sau đó tiếp tục tồn tại.

Các vấn đề liên quan