Relacionameto ManyToMany - Mapeamento de chaves compostas
2 respostas
D
denise2012
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.
Olá . Por mapeamento vc quer dizer as anotações @OneToMany etc ?
Segue o código . Se puder ver o que pode ser…
@EntitypublicclassQuestaoQuestionarioimplementsSerializable{@EmbeddedId@AttributeOverrides({@AttributeOverride(name="questionarioPK",column=@Column(name="questionarioPK",nullable=false)),@AttributeOverride(name="questaoPK",column=@Column(name="questaoPK",nullable=false))})privateQuestaoQuestionarioIdid;@ManyToOne@JoinColumn(name="questionarioPK",nullable=false,insertable=false,updatable=false)privateQuestionarioquestionario;@ManyToOne@JoinColumn(name="questaoPK",nullable=false,insertable=false,updatable=false)privateQuestaoquestao;@NotBlankprivateintordem;publicQuestaoQuestionario(){id=newQuestaoQuestionarioId();}publicvoidsetQuestionario(Questionarioquestionario){this.id.setQuestionarioPK(questionario.getId());this.questionario=questionario;this.questionario.getQuestoesQuestionario().add(this);}publicvoidsetQuestao(Questaoquestao){this.id.setQuestaoPK(questao.getId());this.questao=questao;this.questao.getQuestoesQuestionaro().add(this);}todososgets/setaqui}_________________________ClasseQuestaoQuestionarioId___________________________@EmbeddablepublicclassQuestaoQuestionarioIdimplementsSerializable{@Column(name="questionarioPK",nullable=false)privateIntegerquestionarioPK;@Column(name="questaoPK",nullable=false)privateIntegerquestaoPK;publicQuestaoQuestionarioId(){}implementadoosmétodosgets/sets/equals/hashCode}____________________ClasseQuestao______________________________________@EntitypublicclassQuestaoimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@NotBlankprivateStringtexto;@OneToMany(cascade={CascadeType.MERGE,CascadeType.REMOVE,CascadeType.PERSIST},fetch=FetchType.EAGER)@JoinColumn(name="questaoPK",nullable=false)privateList<OpcaoResposta>opcoesResposta=newArrayList<OpcaoResposta>();@OneToMany(mappedBy="questao")privateList<QuestaoQuestionario>questoesQuestionaro=newArrayList<QuestaoQuestionario>();publicQuestao(){}implementadoosmétodosgets/sets}__________________________ClasseQuestionário______________________________@EntitypublicclassQuestionarioimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@NotBlankprivateStringobjetivo;@OneToMany(mappedBy="questionario")privateSet<Avaliacao>avaliacoes;@OneToMany(mappedBy="questionario")privateList<QuestaoQuestionario>questoesQuestionario=newArrayList<QuestaoQuestionario>();publicQuestionario(){}implementadoosmétodosgets/sets}___________________ClassedeTesteUnitário(QuestaoQuestionarioTest)_______publicclassQuestaoQuestionarioTest{privateQuestaoQuestionarioDAOdao;privateEntityManagerem;@BeforepublicvoidsetUp()throwsException{em=JPAUtil.getEntityManager();dao=newQuestaoQuestionarioDAO(em);}@AfterpublicvoidtearDown()throwsException{em.close();}@TestpublicfinalvoidtestAdiciona(){em.getTransaction().begin();//Questões e Questionário já existentes na base de dados Questaoquestao1=em.getReference(Questao.class,1);Questaoquestao2=em.getReference(Questao.class,2);Questionarioquestionario=em.getReference(Questionario.class,1);QuestaoQuestionarioqq1=newQuestaoQuestionario();QuestaoQuestionarioqq2=newQuestaoQuestionario();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);}