[Hibernate]Tabela associativa com atributos

7 respostas
J

Galera tenho 3 tabelas(convenio, conveniado e conveniado_convenio), essa tabela conveniado_convenio é uma associativa e possui uma coluna a mais(data_inicial), alem dos FK de convenio e conveniado, se não fosse por essa coluna, faria um relacionamento @ManyToMany e ele mesmo criaria essa tabela associativa, certo?!
Qual é a melhor maneira de se fazer esse relacionamento usando annotation?

|Convenio|----------<-|Conveniado_convenio|->----------|Conveniado|

7 Respostas

V
Fica assim:
@Entity
class Convenio {
	...
	@OneToMany(mappedBy = "convenio")
	private ConveniadoConvenio cc;
	...
}

@Entity
class Conveniado {
	...
	@OneToMany(mappedBy = "conveniado")
	private ConveniadoConvenio cc;
	...
}

@Entity
class ConveniadoConvenio {
	...
	@ManyToOne
	@JoinColumn(name = "COLUNA_ID_CONVENIADO", insertable = false, updatable = false)
	private Conveniado conveniado;

	@ManyToOne
	@JoinColumn(name = "COLUNA_ID_CONVENIO", insertable = false, updatable = false)
	private Convenio convenio;

	@Temporal(TemporalType.TIMESTAMP)
	private Calendar dataInicial;
	...
}
E quando você for persistir algo, precisa salvar primeiro o Conveniado e o Convenio, e depois a associação ConveniadoConvenio.

Blz? Flw! :thumbup:

J

Valeu von.juliano,
eu testei assim tb… Ouvi falar que da pra fazer com @ColumnOfElements e @Parent. Qual seria a diferença?

V

psyltrance, isso eu não sei te dizer, até porque ainda não usei essas anotações. Fui olhar a documentação delas e achei umas coisas bem toscas:

http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/class-use/Parent.html
http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/class-use/CollectionOfElements.html

Eu uso da forma que te passei, e pra mim resolve legal!

Blz? Flw! :thumbup:

J

Valeuuuu

L

Nessa tabela associativa, tem q ter ID?

F

Minha dúvida e a mesma do usuário lazaropj.

Nessa tabela associativa, tem q ter ID?

M

Em todas as tabelas que eu crio, ele sempre pede uma chave Primaria, no caso o @Id, dependendo da tabela associativa talvez precise fazer chave composta, assim:

@Entity  
class ConveniadoConvenio {  
    ...  
    @Id
    @ManyToOne  
    @JoinColumn(name = "COLUNA_ID_CONVENIADO", insertable = false, updatable = false)  
    private Conveniado conveniado;  
  
    @Id
    @ManyToOne  
    @JoinColumn(name = "COLUNA_ID_CONVENIO", insertable = false, updatable = false)  
    private Convenio convenio;  
  
    @Temporal(TemporalType.TIMESTAMP)  
    private Calendar dataInicial;  
    ...  
}

ou criar uma PK em um outro campo, assim:

@Entity  
class ConveniadoConvenio {  
    ...  
    @Id @GeneratedValue
    private long id;
    
    @ManyToOne  
    @JoinColumn(name = "COLUNA_ID_CONVENIADO", insertable = false, updatable = false)  
    private Conveniado conveniado;  
  
    @ManyToOne  
    @JoinColumn(name = "COLUNA_ID_CONVENIO", insertable = false, updatable = false)  
    private Convenio convenio;  
  
    @Temporal(TemporalType.TIMESTAMP)  
    private Calendar dataInicial;  
    ...  
}
Criado 25 de junho de 2009
Ultima resposta 24 de nov. de 2012
Respostas 7
Participantes 5