2012-11-29 73 views
10

Tôi có một tập hợp các thực thể kết nối với nhau tạo thành một chu kỳ, thực thể cha mẹ P có hai mối quan hệ một-nhiều với hai thực thể con C1 và C2 và mỗi một trong số này có mối quan hệ một-nhiều với một thực thể khác A. Thực thể A nhận ra sự liên kết của các thực thể này (C1, C2) và xác định các thuộc tính của mối quan hệ (nó không chỉ là một bảng nối). Tất cả các mối quan hệ đều có thể điều hướng theo cả hai hướng.
domain objects
Các câu dưới đây phát sinh từ thiết kế này: Điều gì nên là chiến lược thác để thực thể A có thể được tiếp tục tồn/sáp nhập, cho rằng bạn luôn gọi hoạt động quản lý thực thể trên thực thể gốc P? A có nên được tầng có thể truy cập từ cả hai đường dẫn?JPA + Hibernate - Chu kỳ trong các mối quan hệ thực thể - Chiến lược Cascade

Cân nhắc: Dường như nếu ứng dụng chọn chỉ cung cấp một đường dẫn xếp tầng thì có thể có các tình huống ném TransientObjectException. Nếu nó cung cấp cả hai đường dẫn thì các đường dẫn này phải thực hiện chu kỳ đầy đủ như ví dụ C1 có thể được cố gắng lưu qua A.

Phiên bản: JPA 2.0, lõi Hibernate 4.1.7, hibernate-jpa-2.0-api 1.0 .1

Trả lời

3

Tôi có thể cho bạn 2 xu, xin lỗi nếu câu trả lời của tôi dài một chút.

Nếu bạn có xung đột tầng của loại này, có thể do cách tiếp cận tầng hoặc mô hình miền của bạn không được xác định rõ. Tôi sẽ cẩn thận để khái quát một chiến lược xếp tầng thành một đồ thị tổng thể hoặc một tập hợp các phần tử không liên quan.

Lời khuyên của tôi là chiến lược xếp tầng chỉ nên được sử dụng trên tập hợp dữ liệu gắn chặt với nhau, và cùng loại, như cho lớp và các lớp bên trong (riêng) trong thế giới java. Mối quan hệ giữa lớp mẹ và con của nó cũng phải là độc quyền (trong UML nó được gọi là Hiệp hội không chia sẻ). Tất nhiên bạn có thể làm khác (tất cả chúng ta có thể lười biếng), nhưng cuối cùng bạn có thể tạo ra một trang web liên kết giữa lưu lượng duy nhất của bạn (hoặc cấu hình kiên trì) và dòng chảy kinh doanh của bạn. Bạn sẽ phải quản lý rất nhiều ngoại lệ và thực hiện rất nhiều cấu hình logic xung quanh chiến lược xếp tầng mà bạn đã đặt trước đó (lưu, cập nhật, xóa).

Cách tiếp cận cực đoan là một số có thể chỉ muốn lưu một đối tượng gốc lớn. Tại sao không? phần còn lại "nên tồn tại trong thác". Nhưng trên thực tế, điều này có thể hạn chế nghiêm trọng khả năng bảo trì của hệ thống của bạn. Hơn nữa, bạn có thể phải quản lý trạng thái của biểu đồ lớn trong bộ nhớ, khi tải, lưu và hợp nhất nó.

Nếu bạn làm một ứng dụng web, hoặc bất kỳ ứng dụng máy khách nào, luồng công việc trên web của bạn sẽ có thể lưu một bộ đối tượng giới hạn ở mỗi yêu cầu mà không phải lưu mọi thứ từ phần tử gốc. Tôi biết tôi không trả lời trực tiếp câu hỏi của bạn. Vì vậy, hãy quay lại ví dụ của bạn:

Giả sử P là một Ngân hàng và C1 và C2 là hai Khách hàng và A là Sản phẩm.

Tôi có hai câu trả lời dễ dàng: 1) Mỗi ​​lớp có thể được lưu riêng mà không cần phải xếp tầng. Nhưng nó có thể được thực hiện bên trong cùng một giao dịch, và trong cùng một DAO hay không nếu bạn muốn.

2) P và C "có thể" được xếp chồng. Nhưng A phải được lưu trong một quy trình làm việc khác.

này nhắc tôi nhớ đến một chương của Peter Coad nơi ông nói về một "miền Phân tích Driven": http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

Chương này giải thích như thế nào đối tượng khác nhau trong một đồ thị có thể được tách ra trong các nguyên mẫu khác nhau. Luồng công việc bền bỉ không nên giống nhau giữa dữ liệu giao dịch và mô tả hoặc "điều". Điều này có thể giúp đưa ra chiến lược xếp tầng tốt hơn:

The four archetypes of Peter Coad are: 
- Is it a moment or interval? 
- Is it a role played? 
- Is it a catalog-entry-like description? 
- Otherwise, it's a party, place, or thing. 

Tôi hy vọng điều đó sẽ hữu ích.

3

Nói chung, ý tưởng hay là chỉ xếp tầng trong các liên kết chặt chẽ và chỉ trong hướng dẫn mẹ-> con (hoặc chủ sở hữu-> thuộc sở hữu). Trong trường hợp của bạn, nó có thể là P->C1P->C2. Vì A không có một phụ huynh rõ ràng, nên được lưu riêng. Điều này có thể được thực hiện như @etienno được đề cập trong DAO của bạn trong một giao dịch duy nhất cùng với P (và C1, C2). Tôi không biết mô hình miền của bạn, nhưng thậm chí có thể là A ở cấp độ khái niệm một thực thể riêng biệt trong trường hợp đó, một lưu riêng biệt thậm chí còn hợp lý hơn.

Việc xếp chồng lên nhiều đối tượng không liên quan chặt chẽ trong thời gian dài có thể khiến toàn bộ biểu đồ trở nên lớn hơn, không thể quản lý được.

Trong các trường hợp như vậy, bạn nên đặt câu hỏi "bạn sẽ làm thế nào mà không có Hibernate". Trong trường hợp của bạn, trước tiên bạn có thể lưu P, sau đó C1, C2 và sau đó A. AFAIK JPA/Hibernate không cung cấp bất kỳ cách rõ ràng nào để thực thi thứ tự như vậy, vì vậy một số việc phải được thực hiện bởi bạn theo cách thủ công.

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