Chave Estrangeira Composta

5 respostas
G

Olá,

Estou fazendo um trabalho de aula e comecei a conhecer JPA e JSF para fazê-lo. Estou gostando bastante do que vi até agora.

Tenho uma classe (Entity) Conta que tem relacionamento com a classe Cliente (ManyToOne, obrigatório), também é possível haver um dependente do cliente, surgindo o relacionamento com a classe Dependente (ManyToOne, opcional):

@Entity
public class Conta implements Serializable {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="ContaNumero")
	private Long numero;
        
	@Column(name="ContaDataEmissao")
        @Temporal(TemporalType.DATE)
	private Date dataEmissao;
        
	@Column(name="ContaValor") 
	private Float valor;
        
	@ManyToOne
        @JoinColumn(name="ClienteCodigo")
	private Cliente cliente;
	
        @ManyToOne
        @JoinColumns({
            @JoinColumn(name="ClienteCodigo", referencedColumnName="ClienteCodigo"),
            @JoinColumn(name="DependenteNome", referencedColumnName="DependenteNome", nullable=true)            
        })
	private Dependente dependente;

        
	@OneToMany(mappedBy="conta")        
	private List<ContaProgramacao> contaProgramacao;

//Getters e setters


}

Tenho problema na compilação de que a coluna "ClienteCodigo" foi citada duas vezes:

[color=red]Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: entities.Conta column: ClienteCodigo (should be mapped with insert="false" update="false")[/color]

Se eu incluo os atributos no campo para desativar insert e update, conforme pedido acima, aí ocorre:

[color=red]Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: entities.Contadependente[/color]

Eu poderia tirar a referência com cliente dessa classe e acessar o cliente pelo dependente, certo? Não haveria a duplicidade. O problema é que o cliente sempre deverá ser informado, enquanto que o dependente é opcional, e se informado deve estar relacionado ao cliente.

Alguém me ajudaria a resolver esse problema?

Segue abaixo o diagrama de classes:

[img]http://img100.imageshack.us/img100/5374/financeirodiagrama.png[/img]

5 Respostas

rmendes08

Acho que nesse o caso, o melhor é simplificar o modelo. Elimine a navegação de Conta para Dependente. Como Dependente é na prática, uma lista de nomes relacionado ao Cliente. Modele Dependente como uma lista de String’s mesmo, dentro de Cliente, você pode usa a anotação @CollectionOfElements para isso.

G

Deu certo, obrigado!

Meu código ficou assim:

@Entity
public class Cliente  implements Serializable {        
        @Id
        @GeneratedValue(strategy= GenerationType.AUTO)
        @Column(name="ClienteCodigo")
	private Long codigo;
	 
        @Column(name="ClienteNome", length=60)
	private String nome;
	
        @Column(name="ClienteDiaVencimento", length=2)
	private Integer diaVencimento;
	
        @Column(name="ClienteLimiteCredito")
	private Float limiteCredito;
	
        //@OneToMany(mappedBy="cliente")     
        @CollectionOfElements(targetElement=java.lang.String.class, fetch= FetchType.LAZY)
        @JoinTable(name="ClienteDependente", joinColumns=@JoinColumn(name="ClienteCodigo", referencedColumnName="ClienteCodigo"))
        @Column(name="DependenteNome")
	private List<String> dependentes;

Gostaria de aproveitar e perguntar. Posso utilizar o JPA - Hibernate + JSF normalmente com Tomcat ou é recomendado usar um outro servidor de aplicação que suporte EJB? Quando fui tentar usar aquela opção do Netbeans de gerar JSF + JPA e controller a partir de entidades ele me retornou erro de que o servidor de aplicação não suporta Java EE 6.

Hebert_Coelho

JPA é diferente de EJB. Atualmente ele está desacoplado.

Se você quer utilizar JPA+Hibernate no Tomcat você pode ir tranquilo.

Se você quiser usar EJB você tem que usar um servidor JEE, ou seja, JBoss, Glassfish, Webesphere e assim vai.

O tomcat é um servidor J2SE. [=

rmendes08

jakefrog:
JPA é diferente de EJB. Atualmente ele está desacoplado.

Se você quer utilizar JPA+Hibernate no Tomcat você pode ir tranquilo.

Se você quiser usar EJB você tem que usar um servidor JEE, ou seja, JBoss, Glassfish, Webesphere e assim vai.

O tomcat é um servidor J2SE. [=

O apache tomcat é um servidor JEE sim. Acontece que ele implementa apenas parte da especificação (JSP e Servlets). Uma dificuldade que o pessoal tem é entender que JEE é apenas uma especificação (gigante), e que as implementações de JEE geralmente vem espalhadas em diversos produtos.

Hebert_Coelho

Maneiro.

Vivendo e aprendendo. [=

Criado 28 de janeiro de 2012
Ultima resposta 30 de jan. de 2012
Respostas 5
Participantes 3