Dúvida Mapeamento Hibernate

3 respostas
B

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…

3 Respostas

fbl.lucas

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;  
  
    /* ... */  
}
B

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.

fbl.lucas

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;    
    
    /* ... */    
}
Criado 16 de fevereiro de 2012
Ultima resposta 17 de fev. de 2012
Respostas 3
Participantes 2