2012-08-31 43 views
10

Có thể dừng chế độ ngủ đông từ tự động cập nhật đối tượng liên tục không?Cách tắt tự động cập nhật trong hibernate/JPA

@Transactional 
    public ResultTO updateRecord(RequestTO requestTO) { 

     Entity entity = dao.getEntityById(requestTO.getId()); 

     // now update the entity based on the data in the requestTO 

     ValidationResult validationResult = runValidation(entity); 

     if(validationResult.hasErrors()) { 
      // return ResultTO with validation errors 
     } else { 
      dao.persist(entity); 
     } 
    } 

Đây là những gì xảy ra trong các mã, tôi lấy đơn vị đó sẽ được xem xét bởi hibernate để được ở trạng thái dai dẳng, sau đó tôi cập nhật một số lĩnh vực trong thực thể, sau đó vượt qua các đối tượng để xác nhận. nếu xác nhận không thành công, sau đó không udpate, nếu xác nhận thành công sau đó vẫn tồn tại thực thể. Đây là vấn đề chính với luồng này: bởi vì tôi đã cập nhật thực thể để nó được sử dụng trong quá trình xác nhận, cho dù tôi có gọi phương thức persist() (trên DAO) hay không, bản ghi sẽ luôn luôn là vấn đề được cập nhật vì hibernate phát hiện rằng thực thể đã được thay đổi và gắn cờ nó để cập nhật.

Giữ im tâm Tôi có thể thay đổi cách tôi xác nhận và giải quyết vấn đề, vì vậy tôi không quan tâm đến cách giải quyết. Tôi quan tâm đến việc biết làm thế nào tôi sẽ có thể vô hiệu hóa các tính năng ngủ đông, nơi nó sẽ tự động cập nhật các đối tượng liên tục.

Hãy nhớ rằng tôi đang sử dụng triển khai JPA của hibernates. vì vậy các câu trả lời cụ thể về Hibernate đối phó với API cụ thể hibernate sẽ không hoạt động đối với tôi.

Tôi đã cố gắng tìm cấu hình ngủ đông và xem liệu tôi có thể đặt bất kỳ cấu hình nào để dừng hành vi này nhưng không may mắn.

Cảm ơn

--edit --- tôi không thể tìm thấy một giải pháp này, vì vậy tôi chọn cách lăn trở lại giao dịch mà không ném bất kỳ RuntimeException mặc dù tôi đang ở trong một giao dịch khai báo sử dụng:

TransactionInterceptor.currentTransactionStatus(). SetRollbackOnly();

hoạt động như sự quyến rũ.

Trả lời

0

Ném ngoại lệ nếu xác thực không thành công và yêu cầu người gọi xử lý điều đó.

+0

cảm ơn, nhưng như tôi đã nói im không tìm kiếm một cách giải quyết, tôi đã có điều đó, im tìm kiếm một cấu hình cụ thể để có thể Diable tự động cập nhật. – lutfijd

1

Định cấu hình FlushMode cho phiên của bạn.

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

+0

Đây là API Hibernate cụ thể mà chủ yếu liên quan đến cách hoạt động của chế độ ngủ đông trước khi thực hiện truy vấn (tuôn ra hay không, để tránh dữ liệu cũ). JPA EntityManager cho phép thiết lập chế độ flush nhưng nó cũng chỉ liên quan đến quản lý truy vấn. mặc dù tôi vẫn cố gắng thiết lập chế độ xả trong EntityManager thành các kiểu khác nhau và nó vẫn không tạo ra sự khác biệt. – lutfijd

+0

@user Cảm nhận của bạn không rõ ràng với tôi. Trong liên kết tôi dán ở trên được thiết lập rõ ràng "Đại diện cho một chiến lược xả. Quá trình tuôn ra đồng bộ hóa trạng thái cơ sở dữ liệu với trạng thái phiên bằng cách phát hiện các thay đổi trạng thái và thực thi các câu lệnh SQL". Xem [link] (http://stackoverflow.com/questions/3220336/whats-the-use-of-session-flush-in-hibernate) –

+0

đầu tiên: đây là Hibernate API cụ thể chứ không phải API JPA. giây: Cài đặt chế độ xả JPA không ảnh hưởng đến hành vi kể từ khi JPA có 2 loại chế độ tuôn ra cam kết và tự động và không có chế độ thủ công. để quay lại câu hỏi của tôi về cách vô hiệu hóa cập nhật tự động trong JPA vì các liên kết bạn cung cấp sẽ không giúp ích nhiều trong ngữ cảnh JPA. – lutfijd

0

Bạn có thể gọi đoạn mã sau:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
Các vấn đề liên quan