Problema com Mapeamento JPA e EclipseLink @Cascade

Boa tarde,

Estou na seguinte situação, estou utilizando JPA para fazer o mapeamento das minhas classes, porém não sei como fazer nos três casos que eu tenho:

As classes estão sendo mapeadas por :

@JoinColumn(name = "ODEX_PK", referencedColumnName = "CODIGO")
    @ManyToOne(cascade = CascadeType.ALL)

1- Necessário fazer a inserção no banco de dados das duas Classes, Mov_Capex(Filho) e Odex(Pai). (Este caso está funcionando com o CascadeType.ALL (PERSIST)).
2- Necessário fazer a inserção no banco de dados da classe Mov_Capex e atualizar a classe Odex. (Não funciona, o MERGE não está funcionando nesse caso, sei que ele só funciona quando atualiza o pai e o filho ao mesmo tempo).
3- Necessário fazer a inserção no banco de dados da classe Mov_Capex e não fazer nada na classe Odex. (O REFRESH deveria permitir isso, mas mesmo assim está acusando violação da regra, creio que esteja tentando dar PERSIST). Existe alguma forma ou é preciso dizer qual ele deve utilizar naquele momento?

Obrigado.

Segue as classes abaixo:

Mov_Capex
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.celg.entidade;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.CascadeType;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Rodrigo
 */
@Entity
@Table(name = "MOV_CAPEX")
@XmlRootElement
public class MovCapex extends SuperLogic implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    
    @Column(name = "DATA_CD")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCd;
    @Column(name = "DATA")
    @Temporal(TemporalType.TIMESTAMP)
    private Date data;
    @Column(name = "DATA_REF")
    private String dataRef;
    @javax.persistence.Transient
    private String odex;
    @Column(name = "DESCRICAO_ODEX")
    private String descricaoOdex;
    @Column(name = "OBRAS_TERCEIROS")
    private String obrasTerceiros;
    @Column(name = "ASSUNTO")
    private String assunto;
    @Column(name = "VALOR")
    private BigDecimal valor;
    @Column(name = "NATUREZA")
    private String natureza;
    @Column(name = "PLANO_QUALIDADE")
    private String planoQualidade;
    @Column(name = "MOTIVO")
    private String motivo;
    @JoinColumn(name = "ODEX_PK", referencedColumnName = "CODIGO")
    @ManyToOne(cascade = CascadeType.ALL)
    private Odex odexPk;
    @JoinColumn(name = "CR", referencedColumnName = "CODIGO")
    @ManyToOne
    private Cr cr;
    @javax.persistence.Transient
    private ClassTaxonomia idClassTaxonomia;

    public MovCapex() {
    }

    public MovCapex(Long codigo) {
        this.setCodigo(codigo);
    }

    public Date getDataCd() {
        return dataCd;
    }

    public void setDataCd(Date dataCd) {
        this.dataCd = dataCd;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public String getDataRef() {
        return dataRef;
    }

    public String getOdex() {
        return odex;
    }

    public void setOdex(String odex) {
        this.odex = odex;
    }

    public void setDataRef(String dataRef) {
        this.dataRef = dataRef;
    }

    public Odex getOdexPk() {
        return odexPk;
    }

    public void setOdexPk(Odex odexPk) {
        this.odexPk = odexPk;
    }

    public String getDescricaoOdex() {
        return descricaoOdex;
    }

    public void setDescricaoOdex(String descricaoOdex) {
        this.descricaoOdex = descricaoOdex;
    }

    public String getObrasTerceiros() {
        return obrasTerceiros;
    }

    public void setObrasTerceiros(String obrasTerceiros) {
        this.obrasTerceiros = obrasTerceiros;
    }

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public String getNatureza() {
        return natureza;
    }

    public void setNatureza(String natureza) {
        this.natureza = natureza;
    }

    public String getPlanoQualidade() {
        return planoQualidade;
    }

    public void setPlanoQualidade(String planoQualidade) {
        this.planoQualidade = planoQualidade;
    }

    public String getMotivo() {
        return motivo;
    }

    public void setMotivo(String motivo) {
        this.motivo = motivo;
    }

    public Cr getCr() {
        return cr;
    }

    public void setCr(Cr cr) {
        this.cr = cr;
    }

    public ClassTaxonomia getIdClassTaxonomia() {
        return idClassTaxonomia;
    }

    public void setIdClassTaxonomia(ClassTaxonomia idClassTaxonomia) {
        this.idClassTaxonomia = idClassTaxonomia;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getCodigo() != null ? getCodigo().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof MovCapex)) {
            return false;
        }
        MovCapex other = (MovCapex) object;
        if ((this.getCodigo() == null && other.getCodigo() != null) || (this.getCodigo() != null && !this.getCodigo().equals(other.getCodigo()))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.celg.entidade.MovCapex[ codigo=" + getCodigo() + " ]";
    }
    
}

Odex

package br.com.celg.entidade;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Rodrigo
 */
@Entity
@Table(name = "ODEX")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Odex.findAll", query = "SELECT o FROM Odex o ORDER BY o.odex ASC")})
public class Odex extends SuperLogic implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    
    @Column(name = "ODEX")
    private String odex;
    @JoinColumn(name = "CLASS_TAXONOMIA", referencedColumnName = "CODIGO")
    @ManyToOne
    private ClassTaxonomia idClassTaxonomia;

    public Odex() {
    }

    public Odex(Long codigo) {
        this.setCodigo(codigo);
    }

    public String getOdex() {
        return odex;
    }

    public void setOdex(String odex) {
        this.odex = odex;
    }
    
    public ClassTaxonomia getIdClassTaxonomia() {
        return idClassTaxonomia;
    }

    public void setIdClassTaxonomia(ClassTaxonomia idClassTaxonomia) {
        this.idClassTaxonomia = idClassTaxonomia;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getCodigo() != null ? getCodigo().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Odex)) {
            return false;
        }
        Odex other = (Odex) object;
        if ((this.getCodigo() == null && other.getCodigo() != null) || (this.getCodigo() != null && !this.getCodigo().equals(other.getCodigo()))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.celg.entidade.Odex[ codigo=" + getCodigo() + " ]";
    }
    
}

Qualquer relação de N : 1, 1 : N e N : M depende de você ter setado, em cada uma das instâncias de objeto, todas as relações entre elas.