DTO to Entity And Entity to DTO

tobato picture tobato · Dec 16, 2012 · Viewed 12.8k times · Source

We're to use DTO's to send data to and from the presentation layer. We have layers like:

  • facade
  • appService
  • domain

And We have use Dozer to help us convert entity to dto. But i have 2 question now:

  1. from entity to dto we can use dozer, but from dto to entity can we use dozer? If Yes, How?
  2. Where shoud i create entity? in facade or DTOAssembler?

for example,I have to register a book. the book Entity look's like:

Book{
   public Book(BookNumber number,String name){
      //make sure every book has a business number,
      //and the number can't change once the book is created.
      this.bookNumber = number;
      ..
   }
}

and we hav a DTOAssembler:

BookDTOAssembler{

  BookDTO toDAO(bookEntity){
  ...
  }
  BookEntiy fromDTO(book DTO,BookRepository bookRepository){
    //1.Where should i create book entity? 
    //2.Is there any effective way to convert dto to entity in java world?
  }
}

option 1

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = BookDTOAssembler.fromDTO(book DTO);
}

//Create book in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,BookRepository bookRepository){
    //book is never registered 
    if (0==bookDTO.getBookID()){
       Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
    }else{
       //book is been registed so we get it from Repository
       book = bookRepository.findById(bookDTO.getBookID()); 
    }
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

option 2

the BookManagedFacade has a registerBook function:
public registerBook(bookDTO){
   Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName());
   book = BookDTOAssembler.fromDTO(book DTO,book);
}

//add another function in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,Book book){
    book.setAuthor(bookDTO.getAuthor);
    ...
    return book;
}

With one is better? Or It can be implemented in a better way..?

Answer

jgauffin picture jgauffin · Dec 18, 2012

Typically you do not transfer objects (DTO representations of the domain entities) back to the server. Because if you do so you break encapsulation since anyone could just apply changes to the DTOs and then send the information back.

Instead you should create a service interface which is used to modify the objects since it allows the server to apply changes to it's model.

So the service is really splitted up into two parts:

  1. A query part which is used to fetch DTO representations of all entities
  2. A command part which is used to apply changes to the entities