Dúvida: Java+OO+JPA básicos

8 respostas
diegogeovani

Bom dia a todos.

Permitam-me descrever o quadro. Dados:

tabela [color=darkblue]UP[/color], uma coluna para cada atributo
@Entity
@Table(name="UP")
public class UnidadeProducao {	

	@Id @GeneratedValue	
	private Integer up_id;	

	private Integer codigo;

	private Double cnpj;

}
tabela [color=darkblue]SETOR[/color], duas colunas: 'id' e 'nome'
@Entity
@Table(name="SETOR")
public class Setor {	

	@Transient
	private UnidadeProducao up;
	
	@Id @GeneratedValue 
	private int setor_id;		

	private String nome;
}
tabela [color=darkblue]USUARIO[/color]; suas respectivas colunas mais uma coluna apontando para [color=darkblue]SETOR[/color].setor_id
@Entity
@Table(name="USUARIO")
public class Usuario {

	@Id @GeneratedValue
	private Integer usuario_id;

	private String 	login ;

	private String 	senha ;	

	@OneToOne(fetch=FetchType.LAZY)	
	@JoinColumn(name="setor_id", referencedColumnName="setor_id")
	private Setor setor;

}
Projeto: quero adicionar uma coluna na tabela [color=darkblue]USUARIO[/color] relacionada à [color=darkblue]UP[/color].up_id sem declarar um novo atributo :UnidadeProducao na classe Usuario, tendo em vista que Setor já possui visibilidade para UnidadeProducao.

Ideias?

Agradeço.

8 Respostas

rmendes08

Ora, não precisa, basta você navegar através do grafo de objetos :

Usuario usuario;

//...

usuario.getSetor().getUnidadeProducao().getId();
diegogeovani

Verdade; tentei várias vezes mas não retornou nada. Será que não falta mais nada? setor_id tá beleza, mas quando eu navego até up_id, nada;

rmendes08

Seu problema é este trecho:

@Transient  
private UnidadeProducao up;

nele você diz que o campo up é transiente, e que não deve ser persistido. O que você deve fazer nesse caso é anotar como uma relacionamento (ManyToOne, OneToOne, etc.)

diegogeovani

rmendes08:
Seu problema é este trecho:

@Transient  
private UnidadeProducao up;

nele você diz que o campo up é transiente, e que não deve ser persistido. O que você deve fazer nesse caso é anotar como uma relacionamento (ManyToOne, OneToOne, etc.)


Verdade²; setei como transient porque quero manter a tabela [color=darkblue]SETOR[/color] somente com seus dois campos. Há alguma maneira de criar o relacionamento necessário e não criar uma nova coluna na tabela [color=darkblue]SETOR[/color], nem na tabela [color=darkblue]UP[/color]?

Vlw rmendes08!

rmendes08

diegogeovani:
rmendes08:
Seu problema é este trecho:

@Transient  
private UnidadeProducao up;

nele você diz que o campo up é transiente, e que não deve ser persistido. O que você deve fazer nesse caso é anotar como uma relacionamento (ManyToOne, OneToOne, etc.)


Verdade²; setei como transient porque quero manter a tabela [color=darkblue]SETOR[/color] somente com seus dois campos. Há alguma maneira de criar o relacionamento necessário e não criar uma nova coluna na tabela [color=darkblue]SETOR[/color], nem na tabela [color=darkblue]UP[/color]?

Vlw rmendes08!

Ué, se existe a necessidade de criar esse relacionamento no seu domínio porque você não pode mapear para o seu banco de dados ? Como você vai fazer depois para recuperar esse relacionamento ?

diegogeovani

Aí que está: não sei.

Isso aqui na classe Usuario faria exatamente o que eu quero:
@OneToOne(fetch=FetchType.LAZY)   
    @JoinColumn(name="setor_id", referencedColumnName="setor_id")  
    private Setor setor;

 @OneToOne(fetch=FetchType.LAZY)   
    @JoinColumn(name="up_id", referencedColumnName="up_id")  
    private UnidadeProducao up;
mas porra, totalmente desnecessário e deselegante(neste contexto).

Vou reelaborar o projeto para resolver essa situação. Esse negócio mapeamento objeto relacional é tão "mágico" que eu até exagero.

Obrigado pela atenção de todos. :)

pmlm

O teu problema não é de Java mas sim do conceito do negócio e do desenho da BD. O que é que faz sentido? Um Setor pertencer a uma UP? A várias? Uma UP tem só um Setor? Tem vários?

rmendes08

pmlm:
O teu problema não é de Java mas sim do conceito do negócio e do desenho da BD. O que é que faz sentido? Um Setor pertencer a uma UP? A várias? Uma UP tem só um Setor? Tem vários?

Exatamente. Pensar em ORM como uma solução mágica é um risco muito grande. Eu sempre analizo se o esquema relacional gerado corresponde a minha expectativa. Como regra geral, você deve ser capaz de alternar entre os dois modelos de maneira reflexiva, isto é: OO -> relacional e relacional -> OO.

Criado 13 de julho de 2012
Ultima resposta 13 de jul. de 2012
Respostas 8
Participantes 3