JPA - Relacionamento M:N com atributos

Estava pesquisando na web sobre o tema e encontrei este artigo:

http://rfiume.blogspot.com/2007/04/relacionamento-many-to-many-entre.html

O artigo trata sobre como mapear um relacionamento M:N sem atributos. Questionei ao autor como seria o mapeamento caso a estrutura sofresse uma pequena alteração.

Antes:

CREATE TABLE curso
(
id int8 NOT NULL,
descricao text,
cargahoraria int4 NOT NULL,
nome varchar(100) NOT NULL,
CONSTRAINT curso_pkey PRIMARY KEY (id)
);

CREATE TABLE aluno
(
id int8 NOT NULL,
matricula date NOT NULL,
endereco varchar(255) NOT NULL,
nome varchar(50) NOT NULL,
CONSTRAINT aluno_pkey PRIMARY KEY (id)
);

CREATE TABLE curso_aluno
(
cursos_id int8 NOT NULL,
alunos_id int8 NOT NULL,
CONSTRAINT curso_aluno_pkey PRIMARY KEY (cursos_id, alunos_id),
CONSTRAINT fk_curso_aluno_alunos_id FOREIGN KEY (alunos_id)
REFERENCES aluno (id) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_curso_aluno_cursos_id FOREIGN KEY (cursos_id)
REFERENCES curso (id) ON UPDATE NO ACTION ON DELETE NO ACTION
);

Depois da alteração:

CREATE TABLE curso
(
id int8 NOT NULL,
descricao text,
cargahoraria int4 NOT NULL,
nome varchar(100) NOT NULL,
CONSTRAINT curso_pkey PRIMARY KEY (id)
);

CREATE TABLE aluno
(
id int8 NOT NULL,
matricula date NOT NULL,
endereco varchar(255) NOT NULL,
nome varchar(50) NOT NULL,
CONSTRAINT aluno_pkey PRIMARY KEY (id)
);

CREATE TABLE curso_aluno
(
cursos_id int8 NOT NULL,
alunos_id int8 NOT NULL,
data_matricula date not null,
CONSTRAINT curso_aluno_pkey PRIMARY KEY (cursos_id, alunos_id),
CONSTRAINT fk_curso_aluno_alunos_id FOREIGN KEY (alunos_id)
REFERENCES aluno (id) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_curso_aluno_cursos_id FOREIGN KEY (cursos_id)
REFERENCES curso (id) ON UPDATE NO ACTION ON DELETE NO ACTION
);

Reparem que eu adicionei um novo atributo ao relacionamento. Como vocês resolveriam esta situação?

Eu resolveria da seguinte forma:

Insiro o campo data_matricula como NULL na tabela e faço o mapeamento para na classe.

Blz, na próxima vez q for acontecer a persistência vc passa o objeto (já com a data de matrícula) e o objeto será persistido sem nenhum problema.

Porém, vc terá registros com o campo data_matricula null (q foram persistidos anteriormente). Para isso sugiro q insira via update uma data padrão p todos os registros q estão NULL…tipo: 01/01/1900, assim vc pode saber quais registros naum possuem data de matrícula por causa q sua inserção foi antes de adicionar o novo campo.

Dessa forma, vc terá todos os campos diferentes de NULL e pode alterar o campo data_matricula p NOT NULL.

rp.guimaraes, não se preocupe com os dados. Gostaria de ver a sua solução para o mapeamento ORM com JPA. Por exemplo, abaixo segue a solução para o relacionamento M:N com atributos:

@Entity
public class Curso implements Serializable {
     ...

     @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
     private Set<Aluno> alunos = new HashSet<Aluno>();

     ...
}


@Entity
public class Aluno implements Serializable {
   ...

   @ManyToMany(mappedBy="alunos", fetch=FetchType.EAGER)
   private Set<Curso> cursos = new HashSet<Curso>();

   ...
}

Qual seria usa solução para um M:N com atributos?