Relacionameto ManyToMany - Mapeamento de chaves compostas

2 respostas
D

Oi , estou precisando de ajuda!

Tenho um relacionamento de muitos para muitos entre Questionário e Questão. Questão e Questionário possuem identificadores gerados pela anotação @GeneratedValue. A diferença nesse caso é que a tabela que irá representar a associação tem um atributo que define a ordem em que aparece a questão no questionário.

Procurando nos sites, inclusive nesse forum, compreendi que deveria criar uma classe que representasse essa associação. Portanto, foi o que fiz.
O problema surge quando tento definir a chave da tabela associativa a partir dos atributos identificadores de Questionário e Questão. No momento que vou inserir nessa tabela, após o commit, é lançado uma exceção de Rollback.

Em anexo, coloquei o código. Se alguém puder dar uma olhadinha… e me ajudar.
Desde já obrigada.

2 Respostas

Hebert_Coelho

Como que você mapeou a classe?

D

Olá . Por mapeamento vc quer dizer as anotações @OneToMany etc ?
Segue o código . Se puder ver o que pode ser…

@Entity
public class QuestaoQuestionario implements Serializable{
	
	@EmbeddedId  
	@AttributeOverrides( { @AttributeOverride	(
			name = "questionarioPK", column =  
			@Column(name = "questionarioPK", nullable = false)), 				
	@AttributeOverride(name =  "questaoPK", column = @Column(name = "questaoPK", nullable = false)) })
	private QuestaoQuestionarioId id;
		
	@ManyToOne
	@JoinColumn(name="questionarioPK", 
			nullable = false, insertable = false,
			updatable = false)
	private Questionario questionario;
	
	@ManyToOne
	@JoinColumn(name = "questaoPK", 
			nullable = false, insertable = false,
			updatable = false)
	private Questao questao;
	
	@NotBlank
	private int ordem;
	
	public QuestaoQuestionario(){
		id = new QuestaoQuestionarioId();
		
	}
	
	public void setQuestionario(Questionario questionario) {
		this.id.setQuestionarioPK(questionario.getId());
		this.questionario = questionario;
		this.questionario.getQuestoesQuestionario().add(this);
	}


	public void setQuestao(Questao questao) {
		this.id.setQuestaoPK(questao.getId());
		this.questao = questao;
		this.questao.getQuestoesQuestionaro().add(this);
	}

todos os gets/set aqui

}

_________________________ Classe QuestaoQuestionarioId___________________________


@Embeddable
public class QuestaoQuestionarioId implements Serializable{
	
	@Column(name = "questionarioPK", nullable = false)
	private Integer questionarioPK;
	
	@Column(name = "questaoPK", nullable = false)
	private Integer questaoPK;
	
	public QuestaoQuestionarioId(){
		
	}

implementado os métodos gets/sets/equals/hashCode

}


____________________ Classe Questao ______________________________________


@Entity
public class Questao implements Serializable{
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)  
	private Integer id;
	
	@NotBlank
	private String texto;
	
	@OneToMany( cascade=
			{CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST},
			fetch=FetchType.EAGER)
    @JoinColumn(name="questaoPK", nullable = false)
	private List<OpcaoResposta> opcoesResposta = new ArrayList<OpcaoResposta>();
	
	@OneToMany(mappedBy = "questao")
	private List<QuestaoQuestionario> questoesQuestionaro = new ArrayList<QuestaoQuestionario>();


	public Questao(){
		
	}

implementado os métodos gets/sets

}


__________________________ Classe Questionário ______________________________


@Entity
public class Questionario implements Serializable{
	
	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	private Integer id;
	
	@NotBlank
	private String objetivo;
	
	@OneToMany(mappedBy ="questionario")
	private Set<Avaliacao> avaliacoes;
		
	@OneToMany(mappedBy = "questionario")
	private List<QuestaoQuestionario> questoesQuestionario = new ArrayList<QuestaoQuestionario>();
		
	public Questionario(){
		
	}


implementado os métodos gets/sets

}


___________________Classe de Teste Unitário (QuestaoQuestionarioTest) _______


public class QuestaoQuestionarioTest {

	private QuestaoQuestionarioDAO dao;
	private EntityManager em;
	

	@Before
	public void setUp() throws Exception {
		em =  JPAUtil.getEntityManager();
		dao = new QuestaoQuestionarioDAO(em);
	}

	@After
	public void tearDown() throws Exception {
		em.close();
	}

	@Test
	public final void testAdiciona() {
		
		em.getTransaction().begin();
		
		//Questões e Questionário já existentes na base de dados	
		Questao questao1 = em.getReference(Questao.class, 1);
		Questao questao2 = em.getReference(Questao.class, 2);
		Questionario questionario =em.getReference(Questionario.class, 1);
		
		QuestaoQuestionario qq1 = new QuestaoQuestionario();
		QuestaoQuestionario qq2 = new QuestaoQuestionario();				  				
		
		qq1.setOrdem(1);
		qq1.setQuestao(questao1);
		qq1.setQuestionario(questionario);
		
		qq2.setOrdem(2);
		qq2.setQuestao(questao2);
		qq2.setQuestionario(questionario);
		
		
		dao.adiciona(qq1);
		dao.adiciona(qq2);
		
		em.getTransaction().commit();
		
		Assert.assertTrue(dao.lista().size()==2);
	}
Criado 29 de julho de 2012
Ultima resposta 29 de jul. de 2012
Respostas 2
Participantes 2