2017-10-10 2 views
0

avec Spring Boot avec Hibernate JPAorg.hibernate.PropertyAccessException: valeur du champ mis Impossible avec Composite Key

Je ne parviens pas à accéder à un DAO pour un @Entity qui a une clé composite où l'une des colonnes est un clé étrangère. Il me donne org.hibernate.PropertyAccessException: Could not set field value [...] by reflection lorsque j'essaie de faire un findOne() en utilisant le DAO.

J'ai deux relations MySQL, all_contacts et contact_phones, représenté pour ici:

all_contactscontact_phones

contact_phones a une clé primaire composite constitué de contactid + number, de ces deux, contactId est également clé étrangère pour la même valeur dans all_contacts. J'ai établi la relation avec les @OneToMany appropriées et @ManyToOne annotations

Entité pour all_contacts:

@Entity 
    @Table(name = "all_contacts") 
    public class Contact { 

     @Column(name="userid", columnDefinition ="bigint(13)") 
     private BigInteger userId; 

     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name="contactid", columnDefinition ="bigint(13)") 
     private BigInteger contactId; 


    @OneToMany(mappedBy = "contact", cascade = CascadeType.ALL) 
    @ElementCollection(targetClass=ContactPhones.class) 
    private Set<ContactPhones> phones = new HashSet<ContactPhones>(0); 

    // the rest of the fields, including getters and setters 

    } 

Entité pour contact_phones:

@Entity 
@Table(name ="contact_phones") 
@IdClass(ContactPhonesKey.class) 
public class ContactPhones { 


    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="contactid", nullable = false) 
    @Id 
    private Contact contact; 

    @Column(name="phone_type", columnDefinition = "") 
    private String phoneType; 

    @Id 
    @Column(columnDefinition ="bigint(13)") 
    private BigInteger number; 

    // getters and setters 
} 

Et, parce que la clé primaire de la classe contact_phones était composée (d'où le @IdClass(ContactPhonesKey.class)), j'ai été obligé de créer un cla ss le diriger:

classe pour ContactPhonesKey:

public class ContactPhonesKey implements Serializable { 

    private Contact contact; 
    private String number; 

    public ContactPhonesKey() {} 

    public ContactPhonesKey(Contact contact, String number) { 
    this.contact = contact; 
    this.number = number; 
    } 

// getters and setters 

} 

Cependant, chaque fois que je tente d'accéder à quelque chose par le DAO (quand je l'ai créé une instance de par @Autowired) J'ai fait pour la classe contact_phones:

public interface ContactPhonesRepository extends CrudRepository<ContactPhones, BigInteger> { 

    List<ContactPhones> findByNumberContaining(String number); 


    @Query(value ="SELECT * FROM contact_phones cp WHERE cp.contactid= :contactId", 
      nativeQuery=true) 
    List<ContactPhones> findAllPhonesByContactId(@Param("contactId")BigInteger contactId); 

} 

J'obtiens une erreur de ne pas être en mesure de définir la classe ContactPhonesKey due à la réflexion. Voici l'erreur complète que je reçois:

Could not set field value [111456666] value by reflection : [class app.models.relationentities.ContactPhonesKey.number] setter of app.models.relationentities.ContactPhonesKey.number; nested exception is org.hibernate.PropertyAccessException: Could not set field value [111456666] value by reflection : [class app.models.relationentities.ContactPhonesKey.number] setter of app.models.relationentities.ContactPhonesKey.number 

Répondre

1

Il y a une incompatibilité de type sur le terrain number entre votre entité et ContactPhones ID classe ContactPhonesKey. Sur l'entité, il est déclaré BigInteger, tandis que sur la classe ID, il est déclaré String.