Dúvida Mapeamento Hibernate

Olá pessoal,

estou tendo problemas com um mapeamento entre três classes, não sei nem como procurar este tipo de situação na web, por isso resolvi apelar diretamente aos experts do fórum.

A estrutura que preciso, de forma genérica é a apresentada a seguir.

@Entity
@Table
public class Agencia{
    @Id
    @Column(name = "ID", unique = true, nullable = false)
    private int id;

    @Column(name = "Nome", nullable = false)
    private String nome;

    /* ... */
}
@Entity
@Table
public class ContaCorrente{
    @EmbeddedId
    private ContaCorrentePK id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "agencia", nullable = false, insertable = false, updatable = false)
    private Agencia agencia;

    @Column(name = "conta", nullable = false, insertable = false, updatable = false)
    private int conta;

    /* ... */
}

A classe Agencia possui um inteiro como chave primária. Já a classe ContaCorrente possui como chave primária a Agencia e a Conta do indivíduo.

O problema esta na inclusão de uma terceira classe, conforme abaixo.

@Entity
@Table
public class Operacao{
    @Id
    @Column(name = "ID", nullable = false, unique = true)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "Agencia", nullable = false, insertable=false, updatable=false)
    private Agencia agencia;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
		@JoinColumn(name="Agencia"),
		@JoinColumn(name="Conta")
	})
    private ContaCorrente contaCorrente;

    /* ... */
}

Nesta tabela a agencia é obrigatória e a conta corrente não, para conseguir mapear, preciso colocar o insertable=false e updatable=false no campo agencia.

Ao tentar incluir um novo registro, só consigo gravar o valor da agência se for através da conta corrente. Só que existem casos em que a conta corrente não existe para uma operação.

Da mesma forma se eu tentar alterar um registro já existente, que não possui a conta corrente, ao dar um update o valor da agência é substituido por null.

Existe alguma forma de mapear isso?

Valeu…

Tenta isso:

@Entity  
@Table  
public class Operacao{  
    @Id  
    @Column(name = "ID", nullable = false, unique = true)  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "Agencia", nullable = false)  
    private Agencia agencia;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumns({  
        @JoinColumn(name="Agencia", insertable=false, updatable=false),  
        @JoinColumn(name="Conta")  
    })  
    private ContaCorrente contaCorrente;  
  
    /* ... */  
}  

Já havia tentado isso, porém recebo um

org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed
...

Por isso o meu mapeamento está daquela forma.

Obrigado pela tentativa.

Então só assim mesmo:

@Entity    
@Table    
public class Operacao{    
    @Id    
    @Column(name = "ID", nullable = false, unique = true)    
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    private Long id;    
    
    @ManyToOne(fetch = FetchType.LAZY)    
    @JoinColumn(name = "Agencia", nullable = false)    
    private Agencia agencia;    

    @Column(name = "Conta")    
    private Integer conta; 
    
    @ManyToOne(fetch = FetchType.LAZY)    
    @JoinColumns({    
        @JoinColumn(name="Agencia", insertable=false, updatable=false),    
        @JoinColumn(name="Conta", insertable=false, updatable=false)    
    })    
    private ContaCorrente contaCorrente;    
    
    /* ... */    
}