[Resolvido] Usar composição com VRaptor 3

Salve pessoal! \o/
Inventei aqui de fazer composição, criei a classe Pessoa e coloquei dentro o proprietário, usuário e contato:

public class Pessoa {

@OneToOne(cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name="id_proprietario")
	private Proprietario proprietario;
	
	@OneToOne(cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name="id_contato")
	private Contato contato;
	
	@OneToOne(cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name="id_usuario")
	private Usuario usuario;

Reparei que devido o VRaptor trabalhar com as id’s dos objetos, eu não poderia trabalhar mais com a idProprietario, nem idContato, nem idUsuario, já que teria que ter objeto Pessoa e os inputs ficariam:

pessoa.nome
pessoa.email
//etc

Para alterar e remover teria que chamar idPessoa. =/
Passando pelo Controller a coisa piora, chegando no DAO precisa instanciar o objeto proprietario com new Proprietario(), já que está td na classe Pessoa, ficou uma coisa meio bizonha. Teria que receber no Controller:

public void adiciona(final Pessoa pessoa) {
// codigo
}

Achei horrível, então fiz o inverso, dentro da classe proprietário, contato e usuário coloquei:

@OneToOne(cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name="id_pessoa")
private Pessoa pessoa;

Ai beleza, posso trabalhar com as ids das classes, mesmo que tivesse que mandar no controller Pessoa e Proprietario no parâmetro:

public void adiciona(final Proprietario proprietario, final Pessoa pessoa) {
// codigo
proprietarioDao.adiciona(proprietario, pessoa);
}

Queria saber de vcs se já passaram por esse tipo de abordagem e se resolveram do mesmo jeito que eu fiz, depois de ler vários tópicos fiquei na dúvida se resolvi a questão da forma mais correta.
Agraço!!!

vc pode passar os parâmetros:

pessoa.proprietario.id, pra passar o id do proprietario
pessoa.contato.id, pra passar o id do contato
pessoa.usuario.id, pra passar o id do usuario

ou troque o id pro nome do field que o representa…

qdo vc mandar salvar o hibernate já vai fazer o relacionamento direitinho.

se vc fizer o OneToOne nos dois lados, e nenhum dos dois tiver o atributo mappedBy, vão ser dois relacionamentos diferentes cuidado

Cabe lembrar que a persistência é feita pelo Hibernate ou algum JPA provider. O título correto deveria ser “Usar composição com Hibernate”. :smiley:

Opa! :smiley:
Obrigado pelas dicas mestres!
Garcia, coloquei o título como composição com VRaptor por causa do transporte dos objetos até chegar à camada de persistência, a dúvida nem era com persistência usando Hibernate, mas sim com a passagem de parâmetros usando a id do objeto. Achei que com esse título outras pessoas poderiam tirar essa dúvida de como usar composição com VRaptor, não por causa da persistência, mas por causa da modelagem das classes e consequentemente do transporte das id’s. Aprendi o certo no tapa, quando fui colocar a modelagem em código. =)
Acabei de confirmar que o certo é sempre instanciar a classe de entidade fim, ou seja, seria o proprietário, usuário e contato.

public class Proprietario {
@OneToOne(cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name="id_pessoa")
private Pessoa pessoa;
}

Pronto, agora o transporte das id’s serão feitas usando a entidade fim, mesmo que o objeto pessoa tenha que ir junto.
Lucas, o @OneToOne está anotando somente o atributo pessoa, sem mapped by e do outro lado, na classe pessoa não têm nada. Está com navegabilidade unidirecional. =)
Abraço!!