2010-02-25 38 views
5

Tôi có một thực thể ngủ đông được gọi là Thi hành. Nó được tạo ra trong phần đầu của quá trình của tôi và được cập nhật ở cuối, cho biết nó đã kết thúc như thế nào.Cập nhật thực thể JPA-Hibernate mà không chọn nó từ cơ sở dữ liệu

Tôi muốn cập nhật một thuộc tính duy nhất của thực thể này mà không gây ra sự lựa chọn trong cơ sở dữ liệu của tôi.

Execution execution = entityManager.getReference(Execution.class, executionId); execution.setStatus(Status.FINISHED); // -> Gọi phương thức này sẽ kích hoạt SELECT trong cơ sở dữ liệu của tôi. Tôi không muốn nó xảy ra, tôi chỉ muốn cập nhật thực thể của mình.

Điều này không cụ thể cho phương pháp này, bất kỳ phương pháp nào khác được gọi là kết quả trong mệnh đề SELECT. Trong thực tế, chọn xuất hiện để xảy ra ngay cả trước khi phương pháp của tôi được gọi. Ấn tượng của tôi là các proxy hibernate đặt một số mã bên trong lớp của tôi no-args contructor để kích hoạt mọi lựa chọn mọi phương thức được gọi.

Có thể cập nhật các thực thể JPA/Hibernate mà không cần kích hoạt câu lệnh SELECT trong cơ sở dữ liệu của tôi không?

Trả lời

1

Đây là cách Hibernate hoạt động. Đối tượng proxy của nó tải đối tượng thực từ DB bất cứ khi nào bất kỳ thuộc tính không phải id nào được truy cập.

Thử lưu/tải đối tượng vào đầu quá trình của bạn (để thực hiện SELECT) và đảm bảo rằng phiên không tự động tuôn ra bất cứ khi nào đối tượng được chạm (Tôi nghĩ hành vi mặc định là không tự động tuôn ra , nhưng nó đáng để kiểm tra).

Hoặc bạn cũng có thể thử tách đối tượng của mình khỏi phiên Hibernate trong khi xử lý.

+1

Tôi sẽ chấp nhận câu trả lời này là câu trả lời chính xác. Tôi đã xem xét một giải pháp dễ dàng hơn cho những gì tôi muốn, bằng cách sử dụng JPA-QL Bulk Update/Insert http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/batch.html#batch-direct – user266391

+0

@ user266391 Tôi không quen thuộc với JPA vì vậy cảm ơn cho các liên kết :-) –

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