Duvida relacionamento bidirecional - JPA + Hibernate

Fala, galera !

Sou iniciante no Hibernate + JPA e estou apanhando aqui na seguinte situação: tenho 2 classes, Maquina e Setor. Um Setor possui diversas Maquinas ( relacionamento um para muitos ) e uma Máquina possui apenas 1 Setor ( um para um ). Abaixo estão as classes:

@Entity public class Maquina { @Id @GeneratedValue private Long id; private String nome; @OneToOne ( cascade = CascadeType.ALL ) private ModeloDeMaquina modelo; private Long numeroFabricacao; private Long atip; private Boolean maquinaAtiva; private Setor setor; }

@Entity public class Setor { @Id @GeneratedValue private Long id; private String nome; @OneToMany ( cascade = CascadeType.ALL ) @IndexColumn( name = "maquinas", base=1) private Maquina[] maquinas; }

O problema desta abordagem é que ao consultar uma Maquina para obter o nome do Setor ao qual ela pertence, Setor traz não só o seu nome como também todos seus atributos, incluindo sua relação de máquinas ( inclusive a própria que estamos consultando ). Além de ser desnecessário, acredito que isto implica na performance do programa.

Fiz algumas pesquisas na net e ví que poderia utilizar uma tabela/classe “intermediaria” para unir as informações, conforme o exemplo abaixo:

Aí teria que realizar um INNER JOIN para obter somente o nome do setor de determinada máquina, subtituindo o atributo Setor setor por String setor na classe Maquina, conforme abaixo:

@Entity public class Maquina { @Id @GeneratedValue private Long id; private String nome; @OneToOne ( cascade = CascadeType.ALL ) private ModeloDeMaquina modelo; private Long numeroFabricacao; private Long atip; private Boolean maquinaAtiva; private String setor // ALTERAÇÃO AQUI !! }

Essa abordagem seria correta ? Vcs tem alguma sugestão, galera ?

Seu relacionamento está configurado errado. Um setor tem várias máquinas; é preciso anotar com @OneToMany, até aí tudo bem. Mas na classe Maquina é preciso anotar com @ManyToOne, pois o sentido inverso do relacionamento um para muitos é muitos para um.

E outra coisa, só é preciso criar uma tabela intermediária para expressar relacionamentos muitos para muitos. Esse não é o caso.

Opa, obrigado tnaires ! E qto ao fato de qdo recuperar um objeto Maquina o mesmo trazer em seus atributos um objeto Setor completo ( que possui uma lista de maquinas ) ? Isso não reduz a performance ? No meu caso apenas o nome do setor é importante ao consultar uma Maquina…

Não se preocupe. Quando se trata de collections, o Hibernate por padrão não traz os objetos associados. Eles só serão trazidos quando você acessá-los explicitamente, ou então se você configurar o fetch type da associação para eager.

No seu caso, a lista de máquinas associada ao setor só será carregada no momento em que você chamar um getMaquinas(), por exemplo.

Muito obrigado, tnaires ! Esclareceu minhas dúvidas :smiley: !