Hibernate . Esta dificil

10 respostas
O

Bom dia. Gostaria de saber de vcs uma coisa. Quando eu tenho uma classe entidade no hibernate todas as propriedades desta classe tem que ser mapeadas ou somente as que for necessario.
EX:
Eu tenho uma classe carro e uma classe pneu. Na OO um carro tem varios pneus. E varios pneus sao de um carro.
Na classe Carro eu tenho alem de nome e modelo como propriedades eu tenho uma propriedade que é uma colecao de pneus(Set<Pneu> pneus).
Na classe Pneu eu tenho alem da marca como propriedade eu tenho um Objeto Carro como propriedade.
O relacionamento é unidirecional entre elas. Todos os atributos da classe carro sao mapeados com annotation menos o atributo pneus(Set<Pneu> pneus)
Na classe Pneu eu tenho a relacao (many to one ) annotada, para efetuar a relacao.

A minha duvida é. Na classe carro eu posso deixar o atributo pneus sem annotation? Ou quando eu declaro que uma classe é uma entidade todos atributos tem ser annotados…

Obrigado…

10 Respostas

marcushlm

você não precisa anotar todas as propriedades, você pode ter membros da classe que não existam nas tabelas.

use a annotation @Transient nesses membros.

:wink:

ddduran

Você não precisa anotar atributos que tenham o mesmo nome dos campos nas tabelas, mas você vai precisar fazer a anotação pra esse seu relacionamento (que me desculpe mas acho que é bidirecional :P)

eu diria para você fazer um manyToOne em um e um oneToMany em outro e só indicar quem mapeia o relacionamento (mappingBy)

O

dduram.
Agora vc chegou onde eu queria. Ok. Quando eu declaro mappedBy em uma classe ela é a proprietaria ou o outro lado que é? Tipo No caso UsuarioVO tem declarado mappedBy com MensagemVO (one to many) intao, UsuarioVO é o proprietario ou MensagemVO que é?
E assim que eu descrever quem é o proprietario, somente depois desse proprietario ser persistido que o outro objeto vai ser.

marcelo_mococa

isso mesmo.

em relacionamentos one-to-one o lado com mappedBy será o dono da relação, ou seja, ele que comanda a relação.
em relacionamentos one-to-many / many-to-one, o lado one-to-many será o dono.

Veja um exemplo:

UsuarioVo usu = new UsuarioVo();
MensagemVo mens = new MensagemVo();

mens.setUsuario(usu);

se você fizer somente isso o relacionamento não será persistido.
O dono é o usuário, ele deve ter uma mensagem para a relação seja persistida.

UsuarioVo usu = new UsuarioVo();
MensagemVo mens = new MensagemVo();

usu.getMensagem().add(mens);
mens.setUsuario(usu);

na sua primeira dúvida, eu faria um relacionamento bidirecional.

marcelo_mococa

ops… duplicado…

O

marcelo_mococa …
Olha isso intao…Tirado do Hibernate

Since many to one are (almost) always the owner side of a bidirectional relationship in the EJB3 spec, the one
to many association is annotated by @OneToMany( mappedBy=... )


@Entity
public class Troop {
@OneToMany(mappedBy="troop")
public Set<Soldier> getSoldiers() {
...
}
@Entity
public class Soldier {
@ManyToOne
@JoinColumn(name="troop_fk")
public Troop getTroop() {
...
}


Troop has a bidirectional one to many relationship with Soldier through the troop property. You don't have to
(must not) define any physical mapping in the mappedBy side.
To map a bidirectional one to many, with the one-to-many side as the owning side, you have to remove the
mappedBy element and set the many to one @JoinColumn as insertable and updatable to false. This solution is
obviously not optimized and will produce some additional UPDATE statements.

Aqui nao diz que o dono do relacionamento é o outro lado?

ddduran

Acabei indo almoçar e não vi seu post mas acho que os colegas já responderam :slight_smile:

marcelo_mococa

desculpe…
o lado many-to-one será o owner por default.

mas como você mesmo citou, o comum (talvez correto) é sempre o lado que possui a coleção (list, set, etc…) ser o owner, no caso o lado one-to-many.

Caso o lado many-to-one for o owner, o hibernate (ou jpa) irá salvar as mensagens, depois o usuário e ainda faria um update para cada mensagem, setando a chave estrangeira do usuario.

marcelo_mococa

vale lembrar que com JPA não tem como alterar o owner. Ele sempre será o lado many-to-one.

É esperado que na versão 2.0 a JPA o lado one-to-many será obrigatoriamente o owner.

marcelo_mococa

duplicado de novo… minha net tá uma @!%&

Criado 19 de setembro de 2007
Ultima resposta 19 de set. de 2007
Respostas 10
Participantes 4