Problemas com relação ManyToMany [RESOLVIDO]

Seguinte, criei uma relação ManyToMany e ela não está gravando os dados no banco de dados.
Segue o meu código das relações e do momento da gravação.

Finalidade

@Entity
public class Finalidade implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo_finalidade;
    @Column(name = "nome", length = 100)
    private String nome;
    //... Demais atributos
    
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "finalidademensagem", joinColumns = {
        @JoinColumn(name = "codigo_finalidade")},
    inverseJoinColumns = {
        @JoinColumn(name = "codigo_mensagem")})
    @Cascade({org.hibernate.annotations.CascadeType.MERGE})
    private Collection<InfNfe> mensagens;

 //Get e Set
}

Mensagen

@Entity
public class InfNfe implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo_infnfe;

    @Lob
    @Column(name = "titulo", nullable = false)
    private String titulo;
    
    @Lob
    @Column(name = "mensagem", nullable = false)
    private String mensagem;
    
    @Column(name="status", nullable=true)
    private boolean status;

    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "loginestab")
    private LoginEstab loginestab;
    
    @ManyToMany(fetch= FetchType.LAZY)
    @JoinTable(name="finalidademensagem", joinColumns={@JoinColumn(name="codigo_mensagem")},
            inverseJoinColumns={@JoinColumn(name="codigo_finalidade")})
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Collection<Finalidade> finalidades;
}

FinalidadeMensagem

@Entity
public class FinalidadeMensagem implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @EmbeddedId
    private FinalidadeMensagemPK codigo_mensagem_finalidade;
}

FinalidadeMensagemPK

@Embeddable
public class FinalidadeMensagemPK implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name="codigo_mensagem")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private InfNfe mensagemNFe;
    
    @ManyToOne
    @JoinColumn(name="codigo_finalidade")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Finalidade finalidade;
}

Abaixo o código que uso no momento de fazer a gravação

//            Seta as mensagens na finalidade
            finalidade.setMensagens(listaMensagensFinalidade);
//cria ou edita - Local do erro.
            if (finalidade.getCodigo_finalidade() == null) {
                finalidadeJpa.create(finalidade);
            } else {
                finalidadeJpa.edit(finalidade);
            }

O erro que me retorna é o seguinte

SEVERE: javax.persistence.RollbackException: Error while commiting the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
	at negocio.FinalidadeJpaController.edit(FinalidadeJpaController.java:58)
	at mb.CadastroPessoasMB.cadastraFinalidade(CadastroPessoasMB.java:5776)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:248)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:170)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
	... 52 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into finalidademensagem (codigo_finalidade, codigo_mensagem) values ('3', '2') foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2754)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 60 more

Obrigado pela atenção

Bom pessoal… Eu descobri o erro.
Está no momento da relação, ao invés de usar

eu devo usar assim

Obrigado

Intao como é ManyToMany ru sempre do preferencia de salvar separados
assim:

[code]Ficha f1= new Ficha();
Ingrediente in= new Ingrediente();
Ingrediente in1= new Ingrediente();
Ingrediente in2= new Ingrediente();
f1.setCmv_evento(324);
f1.setProducao(“teste”);
f1.setModo_preparo(“1 no modo geral de prapro se define de varias maneira diferentes”);

    in.setDescricao_ingrediente("milho");
    in1.setDescricao_ingrediente("tomate");

    f1.setIngredientes(new ArrayList<Ingrediente>());
    f1.getIngredientes().add(in);
    f1.getIngredientes().add(in1);


    hiber.insertUpdate(in);//aki eu salvo os item do collection
    hiber.insertUpdate(in1);
    hiber.insertUpdate(f1);// aki eu salvo a entidade principal

[/code]

Como posso dizer pode parecer mais trabalhoso mais é util digamos assim
eu tenho um tabela que eu posso adicionar os ingredientes na receita simplesmente eu cliko
no ingrediente e ja mando salvar sabe, dai se eu quiser usar o mesmo ingrediente en outra receita
eu pesquiso e coloco assim
exemplo:

[code] Ficha f1 = new Ficha();
f1.setProducao(“dasusdhu”);
f1.setModo_preparo(“adsa”);

    Ingrediente ingr= new Ingrediente();
    
    ingr = (Ingrediente) sessao.get(Ingrediente.class,(long) 3);
    f1.setIngredientes(new ArrayList<Ingrediente>());

    f1.getIngredientes().add(ingr);
    hiber.insert(ingr);


    hiber.insertUpdate(f1);[/code]

Aki eu ja nao precisei adicionar o ingrediente no banco pois ele ja existe.

[quote=wilkem]Intao como é ManyToMany ru sempre do preferencia de salvar separados
assim:

[code]Ficha f1= new Ficha();
Ingrediente in= new Ingrediente();
Ingrediente in1= new Ingrediente();
Ingrediente in2= new Ingrediente();
f1.setCmv_evento(324);
f1.setProducao(“teste”);
f1.setModo_preparo(“1 no modo geral de prapro se define de varias maneira diferentes”);

    in.setDescricao_ingrediente("milho");
    in1.setDescricao_ingrediente("tomate");

    f1.setIngredientes(new ArrayList<Ingrediente>());
    f1.getIngredientes().add(in);
    f1.getIngredientes().add(in1);


    hiber.insertUpdate(in);//aki eu salvo os item do collection
    hiber.insertUpdate(in1);
    hiber.insertUpdate(f1);// aki eu salvo a entidade principal

[/code]

Como posso dizer pode parecer mais trabalhoso mais é util digamos assim
eu tenho um tabela que eu posso adicionar os ingredientes na receita simplesmente eu cliko
no ingrediente e ja mando salvar sabe, dai se eu quiser usar o mesmo ingrediente en outra receita
eu pesquiso e coloco assim
exemplo:

[code] Ficha f1 = new Ficha();
f1.setProducao(“dasusdhu”);
f1.setModo_preparo(“adsa”);

    Ingrediente ingr= new Ingrediente();
    
    ingr = (Ingrediente) sessao.get(Ingrediente.class,(long) 3);
    f1.setIngredientes(new ArrayList<Ingrediente>());

    f1.getIngredientes().add(ingr);
    hiber.insert(ingr);


    hiber.insertUpdate(f1);[/code]

Aki eu ja nao precisei adicionar o ingrediente no banco pois ele ja existe.[/quote]

Obrigado pela dica. eu consegui resolver o problema, estava com a clausula errada.
Mas mesmo assim obrigado, vou estudar essa forma, pode ser que seja melhor!
Vlw