2013-11-04 16 views
5

Tôi có 2 thực thể - phim và diễn viên - có mối quan hệ M: N. Khi thiết kế các đối tượng DTO cho các thực thể này, tôi không chắc chắn về cách thức chính xác để đi.Truyền dữ liệu Đối tượng của các thực thể có mối quan hệ M: N hoặc 1: N

Movie

@Entity 
@Table(name = "Movies") 
public class Movie extends AbstractBusinessObject {  

    private String name; 
    private String short_info;  

    @ManyToMany 
    private Map<String, Actor> cast; 

} 

diễn viên

@Entity 
@Table(name = "Actors") 
public class Actor extends Person{ 

    private String name; 

    @ManyToMany(mappedBy = "cast") 
    private Set<Movie> movies; 

} 

Bây giờ liên quan đến DTOs: tôi đã đi qua hai cách khác nhau như thế nào để đối phó với 1: N và M: N mối quan hệ .

Tiết kiệm chỉ ID:

public class MovieDto {  

    private String name; 
    private String short_info;  

    // Long represents Actor's ID 
    private Map<String, Long> cast; 

} 

Tuy nhiên như đã nói here Tôi nghĩ rằng Instead of performing many remote calls on EJBs, the idea was to encapsulate data in a value object, và phương pháp này phá vỡ rõ quy tắc.

Lưu DTO trong DTO: Một cách tiếp cận khác là lưu trữ Dto của Actor, thay vì ID của Actor.

public class MovieDto {  

    private String name; 
    private String short_info; 

    private Map<String, ActorDto> cast; 

} 

Dường như với tôi cách tiếp cận này sẽ nhanh hơn, vì tôi không phải gọi cơ sở dữ liệu mỗi lần tôi cần hiển thị tên của diễn viên.

Giả định này có chính xác không, hay tốt hơn là chỉ lưu trữ ID (thậm chí xem xét mức tiêu thụ không gian của phương pháp thứ hai)?

Cộng với phương pháp thứ hai sẽ dẫn đến một số DTO cho một thực thể. Ví dụ, tôi không cần phải biết những gì phim có diễn viên đóng trong khi nhìn vào một "trang phim", nhưng tôi cần nó khi nhìn vào một "trang diễn viên".

+0

Bạn có thực sự cần dtos không? Chúng thường chỉ là mã trùng lặp. Bạn có thể trả về một thực thể, chỉ có trường id được đặt –

Trả lời

3

Hoàn toàn có thể chấp nhận nhúng các phiên bản DTO khác bên trong DTO gốc. Tất nhiên, điều này có thể bị cấm nếu đối tượng kết thúc là cực kỳ lớn. Vì vậy, đây là nơi bạn phải thực hiện một số loại cân bằng.

Một cách để giải quyết vấn đề này là có một phần đại diện và đại diện đầy đủ. Trong trường hợp bạn không cần dữ liệu hoàn chỉnh, bạn có thể sử dụng biểu diễn một phần. Trong trường hợp bạn cần dữ liệu đầy đủ, bạn có thể sử dụng biểu diễn đầy đủ. Bạn thậm chí có thể có nó để các đại diện đầy đủ nhúng các đại diện một phần bên trong nó (thành phần) và chỉ đơn giản là ngăn chặn các cuộc gọi đến đó (đối với các dữ liệu một phần).

Một cách tiếp cận khác mà tôi đã sử dụng trước đây là cho trình lập bản đồ của tôi (chuyển đổi thực thể thành DTO) nếu tôi cần dữ liệu đầy đủ. Bằng cách này, người lập bản đồ có thể quyết định xem DTO có cần điền dữ liệu bổ sung hay không.

+0

Trong ví dụ này, không có chu kỳ vô tận nếu bạn tạo một DTO chứa các DTO khác? Tạo một MovieDTO, trong đó có ActorDTO, mỗi bộ phim có MovieDTO, mỗi bộ đều có ActorDTO, v.v ... làm cách nào để bạn tạo DTO khi thực thể tham chiếu lẫn nhau? – user798719

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