DTOS e VO ajuda

10 respostas
Deluxe

Pessoal
tenho uma duvida meio chata
vamo la

tenho uma Entidade (DTO) chamada Pessoa

@Entity(name="PESSOA")
@SequenceGenerator(sequenceName="pessoa_jpa",name="pessoa_jpa", allocationSize = 1)   
public class Pessoa implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(generator = "pessoa_jpa", strategy=GenerationType.SEQUENCE)
	@Column(name = "ID_PESSOA")
	private Long id;
	
	@Column(name = "NOME_PESSOA")
	private String nome;
	
	@Column(name = "IDADE")
	private int idade;

gets/sets

e tenho um VO para essa classe PessoaVO

public class PessoaVO {
	
	private Long id;
	private String nome;
	private int idade;

get/set

Meu bean tem um objeto do tiop PessoaVO (pessoaVO)
nas minhas paginas jsp, eu faço o seguinte

<h:inputText size="5" value="#{pessoaBean.pessoaVO.idade}" />

ou seja
meu objeto pessoaVO vem todo populado buninho com os dados da paginas…

agora o metodo salve

facade.save(pessoaVO).

eu mando meu objeto VO pro dao, ou o objeto DTO ?
como eu passo os valores do VO pro DTO ?
o certo seria mandar o DTO pra persistir certo ?

10 Respostas

rod

Na minha opiniao…

  1. Eliminaria o VO.
  2. Seu DTO nao é DTO, na verdade é uma entidade JPA e somente isso.
  3. Trabalhe diretamente com a entidade (entity detached), ou seja, a pagina jsp popula sua entidade (entity detached) que é enviada para o service ou facade para ser persistida ou atualizada.

Acho que assim simplifica bem a arquitetura!

:wink:

Deluxe

Sim,
ficaria mais simples sim.
mas creio que não seria o certo.
pq ai eu estaria usando minhas propriedades da Entidade nas minhas paginas JSP…
ai ficaria algo miturado view com model…
entende?

rod

Deluxe:
Sim,
ficaria mais simples sim.
mas creio que não seria o certo.
pq ai eu estaria usando minhas propriedades da Entidade nas minhas paginas JSP…
ai ficaria algo miturado view com model…
entende?

Entendo sim, mas a principio nao concordo! :smiley:

Seu sistema utiliza EJB? vai funcionar em ambiente distribuido?

Deluxe

hehe
Não

mas estou seguindo alguns padrões

Bean
Facade
Dao
Entidades
VO

não seria certo usar o VO ou Pojo sei la…

rod

Deluxe:
hehe
Não

mas estou seguindo alguns padrões

Bean
Facade
Dao
Entidades
VO

não seria certo usar o VO ou Pojo sei la…

reformulando sua frase “seria certo NÃO usa o VO!” :lol:

brincadeiras a parte, eu mantenho o que sugeri acima.

Sobre o facade, voce precisa ver se realmente seu projeto precisa desse Padrao, afinal nao adianta ficar incluindo varios Padroes em seu projeto sem o projeto realmente precisar deles.

Os Design Patterns servem para resolver determinados problemas e nao para serem utilizados “a vontade”.

Para mim o ideal é manter a arquitetura o mais simples e clara possivel.

Claro que tudo isso é minha opiniao! :wink:

[]'s

E

Existe muita confusao com esses padrões de uma olhada nisso pode te ajudar:

http://blog.fragmental.com.br/2008/05/18/objetos-nao-sao-atributos-funcoes/

http://fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs

brunofuster

Acho que ajuda:

http://blog.dclick.com.br/2009/10/22/transfer-object-pattern-annotations/pt/

G

Deluxe, entendo bem sua posição de usar DTO/VO. Algum motivo você deve ter para usá-los, assim como eu tenho motivo para usar no meu sistema. No meu caso eu além de usar EJBs distribuídos, uso DTOs para não expor todo meu bean para a web, além de poder fazer alguma transformação necessária.

Primeiro você confundiu VO/DTO/Entidade. Entidade (ou VO) é uma classe que você persiste no banco (no caso do JPA). O DTO é o objeto que você transforma e trafega para a web (ou uma aplicação swing, sei la).

O ideal é você dar uma olhada nos design patterns da Sun.

No meu caso o VO/Entity fica enjaulado dentro do meu módulo EJB. O DTO fica disponivel tanto para o projeto web quando para o módulo EJB. Então para transformação uso um Object Assembler no sentido modulo EJB para web, e manualmente no sentido web para o módulo EJB.

Ou seja, quando você carrega uma lista de usuários eu vou no JPA que me retorna vários usuarios. Um object assembler converte para a DTO ainda dentro do módulo EJB. Assim o módulo web recebe uma list de DTOs de usuários. Quando você altera um registro, a camada web envia o DTO alterado para o módulo EJB, onde manualmente no EJB eu faço o set apenas dos dados que eu quero e o JPA salva o objeto. Basicamente assim.

Abraços

G

brunofuster:
Acho que ajuda:

http://blog.dclick.com.br/2009/10/22/transfer-object-pattern-annotations/pt/

Bruno, excelente projeto. Eu criei um Object Assembler (1) bem como padrão Sun. A coisa foi bem corrida e não tive tempo de pensar em algo melhor. Vou olhar teu projeto com calma.

(1) http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObjectAssembler.html

Abraços :thumbup:

Paulo_Silveira

Como o Rodrigo Lazoti e Eric Vieira falaram, muito cuidado ai! Em especial nesse caso onde seu DTO tera a mesma granularidade que sua entidade (isso é, identicos), nao ha necessidade para tal!

No EJB2 isso era necessario sempre por causa que os entity beans eram remotos. Nao sao mais. Voce so deve criar um DTO se precisar mesmo de informacoes especificos de determinadas entidades e não quer pegar tudo. Não há problema algum voce acessar no JSP a sua classe de entidade, não há quebra de camadas nem do MVC.

Criado 23 de abril de 2009
Ultima resposta 24 de out. de 2009
Respostas 10
Participantes 6