OneToOne com comportamento estranho. Help!

Pessoal estou com um problema.

 Tenho três entidades: PedidoParcelamentoBoleto 1 ---- 1 Pedido 1 ---- 1 PedidoParcelamentoCartao. Eu queria que ao persist o Pedido, fosse persistido ou o PedidoParcelamentoBoleto ou o PedidoParcelamentoCartao, no caso o usuario optaria pelo parcelamento com cartão ou boleto, e ao persistir o pedido eu persistiria em cascata um ou outro. Alguém sabe como posso fazer isso?

Segue abaixo meu código que não preenche este requisito, só consigo persistir um pedido se popular os filhos.

Obs.: os id das filhas é o id do pai


@Entity
@Table(name = "pedidos", catalog = "business_web", schema = "")
		
	public class Pedidos implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@Column(name = "ID_PEDIDOS", nullable = false)
	private Integer idPedidos = 0;
	@Basic(optional = false)
	@Column(name = "DATA", nullable = false)
	@Temporal(TemporalType.DATE)
	private Date data = new Date();
	@Basic(optional = false)
	@Column(name = "ID_CLIENTES", nullable = false)
	private int idClientes = 0;
	@Transient 
	private String tipoParcelamento = "";
	@Basic(optional = false)
	@Column(name = "TIPO_CLIENTE", nullable = false, length = 45)
	private String tipoCliente = "";
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "pedidos", fetch = FetchType.LAZY)
	private PedidoParcelamentoBoleto pedidoParcelamentoBoleto = new PedidoParcelamentoBoleto();
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "pedidos", fetch = FetchType.LAZY)
	private PedidoParcelamentoCartao pedidoParcelamentoCartao = new PedidoParcelamentoCartao();
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "pedidos", fetch = FetchType.LAZY)
	private List<ParcelasPagas> parcelasPagasList = new ArrayList<ParcelasPagas>();
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "pedidos", fetch = FetchType.LAZY)
	private List<BoletosPagos> boletosPagosList = new ArrayList<BoletosPagos>();
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "pedidos", fetch = FetchType.LAZY)
	private List<ItemPedidos> itemPedidosList = new ArrayList<ItemPedidos>();

                //omitido


                public class PedidoParcelamentoBoleto implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@Column(name = "ID_PEDIDOS", nullable = false)
	private Integer idPedidos = 0;
	@Basic(optional = false)
	@Column(name = "DIA_FATURA", nullable = false)
	private int diaFatura = 0;
	@Basic(optional = false)
	@Column(name = "VALOR", nullable = false)
	private double valor = 0;
	@JoinColumn(name = "ID_PARCELAMENTO_BOLETO", referencedColumnName = "ID_PARCELAMENTO_BOLETO", nullable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private ParcelamentoBoleto parcelamentoBoleto = new ParcelamentoBoleto();
	@JoinColumn(name = "ID_PEDIDOS", referencedColumnName = "ID_PEDIDOS", nullable = false, insertable = false, updatable = false)
	@OneToOne(optional = false,fetch = FetchType.LAZY)
	private Pedidos pedidos;


                //omitido


                public class PedidoParcelamentoCartao implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@Column(name = "ID_PEDIDOS", nullable = false)
	private Integer idPedidos;
	@Basic(optional = false)
	@Column(name = "VALOR", nullable = false)
	private double valor = 0;
	@JoinColumn(name = "ID_PEDIDOS", referencedColumnName = "ID_PEDIDOS", nullable = false, insertable = false, updatable = false)
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    private Pedidos pedidos;
	@JoinColumn(name = "ID_PARCELAMENTO_CARTAO", referencedColumnName = "ID_PARCELAMENTO_CARTAO", nullable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private ParcelamentoCartao parcelamentoCartao = new ParcelamentoCartao();;
	@JoinColumn(name = "ID_CARTOES", referencedColumnName = "ID_CARTOES", nullable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private Cartoes cartoes = new Cartoes();

                //omitido

O problema é que vc instancia as objetos do tipo parcelamento quando instancia um pedido. Como os relacionamentos estão cascade, tudo que estiver !=null vai ser inserido. Uma opção seria vc só instanciar os objetos do relacionamento se quiser que eles sejam gravados. Outra abordagem é não usar cascade e fazer essa lógica na mão :).

Alberto