Chave composta com chaves estrangeiras

1 resposta
facholi

preciso mapear 1 tabelas q tenho no postgresql com o hibernate e estou com dificuldades. o problema eh com a tabela “disciplinas_grade_curricular”. essa tabela deve ter como chave primária, a chave estrangeira de “disciplinas” + a chave estrangeira da “grade_curricular”. cada “grade_curricular” tem várias disciplinas e eh esta tabela quem cuida disso…

esta eh a VO de “grade_curricular”

@Entity
@SequenceGenerator(name="sq_grd_curriculares",sequenceName="sq_grd_curriculares")
@Table(name="tb_grd_curriculares")
public class GradeCurricular {
	@Id	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sq_grd_curriculares")
	@Column(name="lg_id")
	private Long id;
	@Column(name="lg_curso")
	@JoinColumn(name="lg_curso")
	@ManyToOne
	private Curso curso;
	@Column(name="lg_periodo")
	@JoinColumn(name="lg_periodo")
	@ManyToOne
	private Periodo periodo;
	@Column(name="it_ano_regimento")
	private Integer anoDeRegimento;
	@Column(name="it_fase")
	private Integer fase;
	@OneToMany
	@JoinTable(
			name="tb_grd_cur_medias",
			joinColumns=@JoinColumn(name="lg_grd_curricular"),
			inverseJoinColumns=@JoinColumn(name="lg_media")
	)
	private List<Media> medias;
	@OneToMany
	@JoinTable(
			name="tb_grd_cur_avaliacoes",
			joinColumns=@JoinColumn(name="lg_grd_curricular"),
			inverseJoinColumns=@JoinColumn(name="lg_avaliacao")
	)
	private List<Avaliacao> avaliacoes;
	@OneToMany
	@JoinTable(
			name="tb_grd_cur_disciplinas",
			joinColumns=@JoinColumn(name="lg_grd_curricular"),
			inverseJoinColumns=@JoinColumn(name="lg_disciplina")
	)
	private List<Disciplina> disciplinas;
        ... // getters & setters

e eis a classe q estou tendo dificuldades prá mapear:

@Entity
@Table(name="tb_grd_cur_disciplinas")
public class GradeDeDisciplinas {
	// estas duas declarações precisam ser chaves primárias
	private GradeCurricular gradeCurricular;
	private Disciplina disciplina;

	@Column(name="it_crg_horaria")
	private Integer cargaHoraria;
	@Column(name="it_creditos")
	private Integer creditos;
	@Column(name="it_ordem")
	private Integer ordem;
	@Column(name="lg_sit_frq_baixa")
	@JoinColumn(name="lg_sit_frq_baixa")
	@ManyToOne
	private SituacaoAcademica situacaoDeFrequenciaBaixa;
	... // getters & setters

eu jah li na documentação do hibernate annotations “2.2.6. Mapping composite primary and foreign keys”, mas não consegui compreender…
podem me explicar por favor?

1 Resposta

facholi

eu fiz o seguinte e o hibernate gerou as tabelas como eu queria, mas não sei se estah correto, poderiam me dizer? eh que na classe GradeDeDisciplinasPK, gradeCurricular e Disciplinas não são do tipo Long, mas sim GradeCurricular e Disciplinas respectivamente. seguem as classes:

// classe para a chave primária

@SuppressWarnings("serial")
@Embeddable
public class GradeDeDisciplinasPK implements Serializable {
	@Column(name="lg_grd_curricular")
	private Long gradeCurricular;
	@Column(name="lg_disciplina")
	private Long disciplina;
	...
}

// --

@Entity
@Table(name="tb_grd_cur_disciplinas")
public class GradeDeDisciplinas {
	@Id
	@ManyToOne
	@JoinColumns({
		@JoinColumn(name="lg_grd_curricular", referencedColumnName="id"),
		@JoinColumn(name="lg_disciplinas", referencedColumnName="id")
	})
	private GradeDeDisciplinasPK id;
	@Column(name="it_crg_horaria")
	private Integer cargaHoraria;
	@Column(name="it_creditos")
	private Integer creditos;
	@Column(name="it_ordem")
	private Integer ordem;
	@Column(name="lg_sit_frq_baixa")
	@JoinColumn(name="lg_sit_frq_baixa")
	@ManyToOne
	private SituacaoAcademica situacaoDeFrequenciaBaixa;
	...
}

por favor, se esta não for a maneira correta ou se há algo errado nas anotações me digam… :wink:

Criado 4 de julho de 2006
Ultima resposta 5 de jul. de 2006
Respostas 1
Participantes 1