2013-11-04 26 views
5

Ho due entità - film e attore - che hanno relazione M: N. Quando progetti oggetti DTO per queste entità non sono sicuro di quale sia la strada giusta da percorrere.Trasferimento dati Oggetti di entità con relazioni M: N o 1: N

film

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

    private String name; 
    private String short_info;  

    @ManyToMany 
    private Map<String, Actor> cast; 

} 

Attore

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

    private String name; 

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

} 

Ora, riguardo alle DTOs: ho incontrato due modi diversi come affrontare con 1: N e M: N rapporti .

salvando solo gli ID:

public class MovieDto {  

    private String name; 
    private String short_info;  

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

} 

Tuttavia come detto here ho pensato che Instead of performing many remote calls on EJBs, the idea was to encapsulate data in a value object, e questo approccio rompe chiaramente la regola.

Salvataggio DTOs in DTOs: Un altro approccio sarebbe quello di Dto negozio di attore, invece del suo ID.

public class MovieDto {  

    private String name; 
    private String short_info; 

    private Map<String, ActorDto> cast; 

} 

Mi sembra che questo approccio sarebbe più veloce, come io non devo chiamare la base di dati ogni volta che ho bisogno di mostrare il nome dell'attore, per esempio.

Questa supposizione è corretta o sarebbe meglio memorizzare solo ID (anche considerando il consumo di spazio del secondo approccio)?

Inoltre, il secondo approccio comporterebbe un numero di DTO per una entità. Per esempio, non ho bisogno di sapere in che film ha recitato l'attore quando ho visto una "pagina del film", ma ho bisogno di farlo quando guardo una "pagina degli attori".

+0

Hai davvero bisogno di dtos? Spesso sono solo codice duplicato. È possibile restituire un'entità, che ha solo il campo id impostato –

risposta

3

È perfettamente accettabile incorporare altre istanze DTO all'interno di un DTO padre. Naturalmente, questo può diventare proibitivo se l'oggetto finisce per essere estremamente grande. Quindi questo è dove devi fare una sorta di compromesso.

Un modo per aggirare questo è avere una rappresentazione parziale e una rappresentazione completa. Nei casi in cui non è necessario disporre dei dati completi, è possibile utilizzare la rappresentazione parziale. Nei casi in cui hai bisogno dei dati completi, puoi utilizzare la rappresentazione completa. Puoi persino averlo in modo che la rappresentazione completa incorpori la rappresentazione parziale al suo interno (composizione) e semplicemente rimandi le chiamate a quello (per i dati parziali).

Un altro approccio che ho usato prima è di dire al mio mappatore (che converte l'entità al DTO) se ho bisogno dei dati completi. In questo modo il mappatore può decidere se il DTO deve essere popolato con dati aggiuntivi.

+0

In questo esempio, non ci sono cicli infiniti se si crea un DTO che contiene altri DTO? Crea un MovieDTO, che ha ActorDTOs, ognuno dei quali ha MovieDTOs, ognuno dei quali ha ActorDTOs, etc etc ... come crei DTO quando le Entità si richiamano? – user798719