2009-12-08 25 views
6

Tôi đang làm việc trên ứng dụng web JPA (Hibernate), Spring and Stripes. Tôi có một số thực thể JPA có các trường sau đây chung cho cả mục đích kiểm tra và truy vấn:Cài đặt được tạoBởi và cập nhậtBởi trong các thực thể JPA tự động

createBy - ID người dùng của người tạo pháp nhân. createdOn - ngày thực thể được tạo ra updatedBy - ID người dùng của người cập nhật lần cuối thực thể updatedOn - ngày tổ chức được cập nhật lần cuối

Tôi đã có ứng dụng của tôi làm việc để createdOn và updatedOn là thiết lập tự động khi thực thể được duy trì nhưng tôi không chắc chắn làm thế nào tôi có thể nhận được các trường createdBy và updatedBy được điền mà không phải chuyển qua ID người dùng hiện đang đăng nhập tất cả từ lớp điều khiển đến DAO.

Có ai có bất kỳ đề xuất nào về cách tôi có thể thực hiện việc này mà không chuyển userID trên khắp nơi không? Lưu ý rằng ID người dùng hiện tại được lưu trữ trong đối tượng HttpSession tại thời điểm này, vì vậy chương trình phụ trợ của tôi cần truy cập dữ liệu này bằng cách nào đó ...

Cảm ơn!

+0

Bạn không muốn thiết lập tạoBởi và cập nhậtBởi trong bộ điều khiển trước khi lưu giữ? – yihtserns

+0

Bạn đã sử dụng cơ chế nào để kiểm tra xem đối tượng có bị bẩn không, vì vậy bạn đặt trường 'updateBy/At'? Tôi hỏi câu hỏi liên quan, xin vui lòng kiểm tra nó: http: // stackoverflow.com/questions/20620406/how-to-set-user-id-on-entity-update – WelcomeTo

Trả lời

1

Tôi đã quyết định rằng một ThreadLocal có lẽ là cách sạch nhất để thực hiện điều này trong ứng dụng của mình.

3

Bạn có thể có một cái nhìn tại một trong những phương pháp để vượt qua ID người dùng như bối cảnh trong lớp kinh doanh:

(Các bài viết vẫn có thể liên quan ngay cả khi bạn không sử dụng EJB. Tuy nhiên, bài đăng thứ hai có ý nghĩa chỉ khi bạn sử dụng Spring with JTA)

Cá nhân tôi không khuyến khích chúng cách tiếp cận, như tôi cảm nhận được hai vấn đề với nó:

  • Testability: dữ liệu theo ngữ cảnh sẽ cần phải được thiết lập trong các thử nghiệm
  • hợp đồng: dữ liệu theo ngữ cảnh tham gia vào hợp đồng sử dụng đối tượng nhưng không phải là rõ ràng trong giao diện.

Chuyển ID người dùng "khắp nơi" có vẻ như là một công việc lớn, nhưng tôi nghĩ nó sạch hơn.

Để đặt ngày và ID người dùng tự động khi thực thể được tạo hoặc cập nhật, bạn có thể sử dụng EntityListener or lifecycle callbacks (có thể bạn đã làm điều đó). Hy vọng nó sẽ giúp ...

0

Tôi muốn tạo ra một lớp như thế này:


@MappedSuperclass 
public abstract class AuditableDomainClass { 
    private long createdBy; 
    private long updatedBy; 

    //getters and setters 

lớp thực thể của bạn có yêu cầu bạn đã mô tả đơn giản là sẽ mở rộng lớp này, bạn nên đặt bạn biến trong lớp bạn cần (bộ điều khiển ví dụ) và bạn không cần phải lo lắng về nó tất cả các con đường xuống trong DAO.

+0

Vâng, tôi đã có một cái gì đó như thế này - vấn đề của tôi là tôi không muốn chuyển các biến vào từ lớp điều khiển - nhưng có vẻ như tôi phải làm vậy. – JMM

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