@OneToMany = usando Hibernate dá erro em design time!

4 respostas
saviobarr

Olá amigos,
Fiz uma implementação de duas classes: Cliente e Veiculo, onde um cliente pode ter vários veiculos. O problema é que quando eu coloco atributo mappedBy no atributo
private veiculos; (ou no get desse atributo), o Eclipse dá um erro em tempo de design, dizendo attribute named “cliente” has invalid mapping for this relationship (atributo “cliente” tem mapeamento inválido para esse relacionamento).
Trecho dos codigos:
Cliente

public class Cliente{
       private Integer idCliente;
       private String nomeCliente;   
       private List<Veiculo> veiculos;
 
       //getters e setters  
       @Id
       @GeneratedValue(strategy=GenerationType.IDENTITY)
       @Column(name="id_cliente")
       public Integer getIdCliente() {
              return idCliente;
       }
      public void setIdCliente(Integer idCliente) {
          this.idCliente = idCliente;
      }
      //outros getters e setters do Cliente omitidos
 
      //Aqui ocorre o problema
     @OneToMany(mappedBy="cliente") //aqui ocorre o erro no eclipse: attribute named "cliente" has invalid mapping for this relationship 
     public List<Veiculo> getVeiculos() {
          return veiculos;
     }
     public void setVeiculos(Set<Veiculo> veiculos) {
           this.veiculos = veiculos;
     }
 
 }
//trecho do código da entidade veiculo
@Entity
       Public class Veiculo {
       @Id
       @GeneratedValue(strategy=GenerationType.IDENTITY)
       @Column(name="id_veiculo")
       private Integer idVeiculo;
       private String marca;
       private String modelo;
       private Cliente cliente;


       //getters e setters de marca e modelo omitidos

        //getters e setters de cliente no lado do veiculo
        @ManyToOne
        public Cliente getCliente() {
             return cliente;
         }
        public void setCliente(Cliente cliente) {
              this.pessoa = pessoa;
        }
}

Pelo que diz na spec seção 9.1.23 deveria funcionar:

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToOne {
     Class targetEntity() default void.class;
     CascadeType[] cascade() default {};
     FetchType fetch() default EAGER;
     boolean optional() default true;
     String mappedBy() default "";
}

mappedBy (Optional) The field that owns the relationship. The mappedBy element is only specified on the inverse (non-owning) side of the association.

Usando o Toplink funciona…


Cordialmente,

Sávio Barros
+55 ([telefone removido]
+55 ([telefone removido]


msn: [email removido]

4 Respostas

rissato

falta vc definir os parâmetros da @ManyToOne e colocar um @JoinColumn pra fazer a amarração.

saviobarr

Olá,
Isso que vc disse daria erro em runtime.

saviobarr

A quais parâmetros você está se referindo? mappedBy é um dos parâmetros, e é justamente o parâmetro que dá dando pau em design time.
[]'s

Sávio Barros

saviobarr

E de qq forma, segundo o item 9.1.24 da especificação JPA, se você não informar valores de parâmetros (o q a spec chama de elementos) para o OneToMany, ele assume valores padrão, exceto para o elemento mappedBy, que você pode passar qq String. Olha só meu problema: quando informo o mappedBy, o erro ocorre em design time, no momento da codificação, como se informasse um parâmetro incorreto na chamada de um método.
Algum colega já passou por isso? É um erro meio cabeludo. E o pior: no Toplink Essentials funciona… :-S

[]'s

Sávio Barros

Criado 9 de outubro de 2008
Ultima resposta 9 de out. de 2008
Respostas 4
Participantes 2