保存数据时出错,无法设置int字段

neekobn8  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(346)

我必须创建一个java spring web应用程序,但我遇到了一个问题:

  1. java.lang.IllegalArgumentException: Can not set int field Métier.Visiteur.VstId to Métier.Visiteur
  2. at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:na]
  3. at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:na]
  4. at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) ~[na:na]
  5. at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56) ~[na:na]
  6. at java.base/java.lang.reflect.Field.getInt(Field.java:594) ~[na:na]
  7. at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:62) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  8. at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  9. at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:5119) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  10. at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4819) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  11. at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:294) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  12. at org.hibernate.event.internal.EntityState.getEntityState(EntityState.java:59) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  13. at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:95) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  14. at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  15. at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  16. at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:714) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]
  17. at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:700) ~[hibernate-core-5.4.11.Final.jar:5.4.11.Final]

访客:

  1. package Métier;
  2. import javax.persistence.*;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. /**
  7. * Temporal mapping : https://thorben-janssen.com/hibernate-jpa-date-and-time/
  8. * TODO : Vérifier que les attributs sont nullables
  9. */
  10. @Entity
  11. public class Visiteur {
  12. @Id
  13. @GeneratedValue(strategy = GenerationType.IDENTITY)
  14. @Column(updatable = false, nullable = false)
  15. public int VstId;
  16. private String adresse;
  17. private String code_postal;
  18. private String ville;
  19. @Temporal(TemporalType.DATE)
  20. private Date date_embauche;
  21. @OneToMany
  22. private List<FicheFrais> fichesFrais = new ArrayList<FicheFrais>();
  23. public Visiteur() {
  24. }
  25. public void addFicheFrais(FicheFrais ff) {
  26. fichesFrais.add(ff);
  27. }
  28. public String getAdresse() {
  29. return adresse;
  30. }
  31. public void setAdresse(String adresse) {
  32. this.adresse = adresse;
  33. }
  34. public int getVstId() {
  35. return VstId;
  36. }
  37. public void setVstId(int id) {
  38. this.VstId = id;
  39. }
  40. public String getCode_postal() {
  41. return code_postal;
  42. }
  43. public void setCode_postal(String code_postal) {
  44. this.code_postal = code_postal;
  45. }
  46. public String getVille() {
  47. return ville;
  48. }
  49. public void setVille(String ville) {
  50. this.ville = ville;
  51. }
  52. public Date getDate_embauche() {
  53. return date_embauche;
  54. }
  55. public void setDate_embauche(Date date_embauche) {
  56. this.date_embauche = date_embauche;
  57. }
  58. }

自动生成的主键有问题吗?
此表链接到另一个名为“fichefrais”的表,此表有一个复合键(使用可嵌入注解创建),它在其中引用visiteur(具有多个one关联)
根本没有查询,我只是尝试持久化一个visiteur示例,如下所示:

  1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("GSBSpring");
  2. EntityManager em = emf.createEntityManager();
  3. Visiteur vst = new Visiteur();
  4. // vst.setId((long) 1);
  5. FicheFraisPK fpk = new FicheFraisPK(vst, Mois.AVRIL);
  6. FicheFrais ff = new FicheFrais();
  7. ff.setEtat(Etat.ENCOURS);
  8. ff.setId(fpk);
  9. vst.addFicheFrais(ff);
  10. EntityTransaction transaction = em.getTransaction();
  11. transaction.begin();
  12. em.persist(vst);
  13. em.persist(fpk);
  14. em.persist(ff);

编辑:这里是fichefrais(与visiteur链接):

  1. package Métier;
  2. import org.hibernate.annotations.ManyToAny;
  3. import javax.persistence.*;
  4. import java.io.Serializable;
  5. import java.util.Date;
  6. /**
  7. * Enum mapping : https://thorben-janssen.com/hibernate-enum-mappings/
  8. * TODO : Faire les méthodes ? total_frais_forfaitaire, total_frais_hors_forfait ?
  9. * TODO : Vérifier si la clé composée est fonctionnelle
  10. */
  11. @Entity
  12. public class FicheFrais implements Serializable {
  13. @Enumerated(EnumType.STRING)
  14. private Etat etat;
  15. @EmbeddedId
  16. private FicheFraisPK id;
  17. private int nb_justificatifs;
  18. private float montant_valide;
  19. @Temporal(TemporalType.DATE)
  20. private Date date_modif;
  21. public FicheFraisPK getId() {
  22. return id;
  23. }
  24. public void setId(FicheFraisPK ident) {
  25. id = ident;
  26. }
  27. public Etat getEtat() {
  28. return etat;
  29. }
  30. public Visiteur getVisiteur() {
  31. return id.visiteur;
  32. }
  33. public void setVisiteur(Visiteur vst) {
  34. id.visiteur = vst;
  35. }
  36. public void setEtat(Etat etat) {
  37. this.etat = etat;
  38. }
  39. public int getNb_justificatifs() {
  40. return nb_justificatifs;
  41. }
  42. public void setNb_justificatifs(int nb_justificatifs) {
  43. this.nb_justificatifs = nb_justificatifs;
  44. }
  45. public float getMontant_valide() {
  46. return montant_valide;
  47. }
  48. public void setMontant_valide(float montant_valide) {
  49. this.montant_valide = montant_valide;
  50. }
  51. public Date getDate_modif() {
  52. return date_modif;
  53. }
  54. public void setDate_modif(Date date_modif) {
  55. this.date_modif = date_modif;
  56. }
  57. }

它是嵌入的ID:

  1. package Métier;
  2. import javax.persistence.Embeddable;
  3. import javax.persistence.EnumType;
  4. import javax.persistence.Enumerated;
  5. import javax.persistence.ManyToOne;
  6. import java.io.Serializable;
  7. import java.util.Objects;
  8. @Embeddable
  9. public class FicheFraisPK implements Serializable {
  10. @ManyToOne
  11. Visiteur visiteur;
  12. @Enumerated(EnumType.STRING)
  13. Mois mois;
  14. public FicheFraisPK() {
  15. }
  16. public FicheFraisPK(Visiteur vst, Mois ms) {
  17. this.visiteur = vst;
  18. this.mois = ms;
  19. }
  20. @Override
  21. public boolean equals(Object o) {
  22. if (this == o) return true;
  23. if (!(o instanceof FicheFraisPK)) return false;
  24. FicheFraisPK that = (FicheFraisPK) o;
  25. return Objects.equals(getVisiteur(), that.getVisiteur()) &&
  26. Objects.equals(getMois(), that.getMois());
  27. }
  28. @Override
  29. public int hashCode() {
  30. return Objects.hash(getVisiteur(), getMois());
  31. }
  32. private Visiteur getVisiteur() {
  33. return visiteur;
  34. }
  35. private void setVisiteur(Visiteur visiteur) {
  36. this.visiteur = visiteur;
  37. }
  38. public Mois getMois() {
  39. return mois;
  40. }
  41. public void setMois(Mois mois) {
  42. this.mois = mois;
  43. }
  44. }
ruyhziif

ruyhziif1#

尝试这样的Map:

  1. @Entity
  2. public class Visiteur {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. @Column(updatable = false, nullable = false)
  6. public int VstId;
  7. private String adresse;
  8. private String code_postal;
  9. private String ville;
  10. @Temporal(TemporalType.DATE)
  11. private Date date_embauche;
  12. @OneToMany(mappedBy = "visiteur")
  13. private List<FicheFrais> fichesFrais = new ArrayList<FicheFrais>();
  14. }
  15. @Entity
  16. public class FicheFrais implements Serializable {
  17. @Enumerated(EnumType.STRING)
  18. private Etat etat;
  19. @EmbeddedId
  20. private FicheFraisPK id;
  21. @ManyToOne
  22. @JoinColumn(name = "Visiteur_id", insertable = false, updatable = false)
  23. Visiteur visiteur;
  24. private int nb_justificatifs;
  25. private float montant_valide;
  26. @Temporal(TemporalType.DATE)
  27. private Date date_modif;
  28. }
  29. @Embeddable
  30. public class FicheFraisPK implements Serializable {
  31. @Column(name = "Visiteur_id")
  32. int VstId;
  33. @Enumerated(EnumType.STRING)
  34. Mois mois;
  35. }
展开查看全部

相关问题