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:
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