Câu hỏi của tôi là: Có vai trò nào đối với JPA merge
trong ứng dụng web không quốc tịch không?JPA hợp nhất trong một ứng dụng web RESTful với DTO và Khóa lạc quan?
Có rất nhiều cuộc thảo luận về SO về hoạt động merge
trong JPA. Ngoài ra còn có một great article on the subject tương phản JPA hợp nhất thông qua quy trình Do-It-Yourself thủ công hơn (nơi bạn tìm thấy thực thể thông qua trình quản lý thực thể và thực hiện các thay đổi của bạn).
Ứng dụng của tôi có mô hình miền phong phú (thiết kế theo hướng tên miền) sử dụng chú thích @Version
để sử dụng khóa lạc quan. Chúng tôi cũng đã tạo DTO để gửi qua dây như một phần của các dịch vụ web RESTful của chúng tôi. Việc tạo ra lớp DTO này cũng cho phép chúng tôi gửi cho khách hàng tất cả mọi thứ nó cần và không có gì nó không.
Cho đến nay, tôi hiểu đây là một kiến trúc khá điển hình. Câu hỏi của tôi là về các phương thức dịch vụ cần cập nhật (tức là HTTP PUT) các đối tượng hiện có. Trong trường hợp này chúng ta có hai cách tiếp cận này 1) JPA Merge, và 2) DIY.
Điều tôi không hiểu là cách hợp nhất JPA thậm chí có thể được coi là một tùy chọn để xử lý cập nhật. Đây là suy nghĩ của tôi và tôi tự hỏi nếu có điều gì đó tôi không hiểu:
1) Để tạo đúng thực thể JPA tách biệt với DTO dây, số phiên bản phải được đặt chính xác ... khác với OptimisticLockException được ném. Nhưng spec JPA nói:
Một thực thể có thể truy cập vào trạng thái của trường phiên bản của nó hoặc tài sản hoặc xuất một phương pháp để sử dụng bởi các ứng dụng để truy cập vào phiên bản, nhưng không được sửa đổi giá trị phiên bản [30] . Chỉ nhà cung cấp kiên trì mới được phép đặt hoặc cập nhật giá trị của thuộc tính phiên bản trong đối tượng.
2) Hợp nhất không xử lý các mối quan hệ hai hướng ... các trường trỏ ngược luôn kết thúc bằng không.
3) Nếu bất kỳ trường hoặc dữ liệu nào bị thiếu từ DTO (do cập nhật một phần), thì việc hợp nhất JPA sẽ xóa các mối quan hệ đó hoặc loại bỏ các trường đó. Hibernate có thể xử lý các cập nhật từng phần, nhưng không thể hợp nhất JPA. DIY có thể xử lý các cập nhật một phần.
4) Điều đầu tiên mà phương pháp hợp nhất sẽ làm là truy vấn cơ sở dữ liệu cho ID tổ chức, vì vậy không có lợi ích hiệu suất nào trên DIY.
5) Trong bản cập nhật DYI, chúng tôi tải thực thể và thực hiện thay đổi theo DTO - không có cuộc gọi đến merge
hoặc persist
cho vấn đề đó vì bối cảnh JPA thực hiện mẫu đơn vị công việc hộp.
Tôi có trực tiếp không?
Edit:
6) Merge hành vi liên quan đến các mối quan hệ có thể lười nạp differ amongst providers.