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

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

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

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

访客:

package Métier;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Temporal mapping : https://thorben-janssen.com/hibernate-jpa-date-and-time/
 * TODO : Vérifier que les attributs sont nullables
 */
@Entity
public class Visiteur {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false, nullable = false)
    public int VstId;
    private String adresse;
    private String code_postal;
    private String ville;
    @Temporal(TemporalType.DATE)
    private Date date_embauche;
    @OneToMany
    private List<FicheFrais> fichesFrais = new ArrayList<FicheFrais>();

    public Visiteur() {
    }

    public void addFicheFrais(FicheFrais ff) {
        fichesFrais.add(ff);
    }

    public String getAdresse() {
        return adresse;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public int getVstId() {
        return VstId;
    }

    public void setVstId(int id) {
        this.VstId = id;
    }

    public String getCode_postal() {
        return code_postal;
    }

    public void setCode_postal(String code_postal) {
        this.code_postal = code_postal;
    }

    public String getVille() {
        return ville;
    }

    public void setVille(String ville) {
        this.ville = ville;
    }

    public Date getDate_embauche() {
        return date_embauche;
    }

    public void setDate_embauche(Date date_embauche) {
        this.date_embauche = date_embauche;
    }

}

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

EntityManagerFactory emf = Persistence.createEntityManagerFactory("GSBSpring");
    EntityManager em = emf.createEntityManager();
    Visiteur vst = new Visiteur();
    // vst.setId((long) 1);
    FicheFraisPK fpk = new FicheFraisPK(vst, Mois.AVRIL);

    FicheFrais ff = new FicheFrais();
    ff.setEtat(Etat.ENCOURS);
    ff.setId(fpk);

    vst.addFicheFrais(ff);

    EntityTransaction transaction = em.getTransaction();
    transaction.begin();

    em.persist(vst);
    em.persist(fpk);
    em.persist(ff);

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

package Métier;

import org.hibernate.annotations.ManyToAny;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * Enum mapping : https://thorben-janssen.com/hibernate-enum-mappings/
 * TODO : Faire les méthodes ? total_frais_forfaitaire, total_frais_hors_forfait ?
 * TODO : Vérifier si la clé composée est fonctionnelle
 */
@Entity
public class FicheFrais implements Serializable {
    @Enumerated(EnumType.STRING)
    private Etat etat;

    @EmbeddedId
    private FicheFraisPK id;

    private int nb_justificatifs;
    private float montant_valide;
    @Temporal(TemporalType.DATE)
    private Date date_modif;

    public FicheFraisPK getId() {
        return id;
    }

    public void setId(FicheFraisPK ident) {
        id = ident;
    }

    public Etat getEtat() {
        return etat;
    }

    public Visiteur getVisiteur() {
        return id.visiteur;
    }

    public void setVisiteur(Visiteur vst) {
        id.visiteur = vst;
    }

    public void setEtat(Etat etat) {
        this.etat = etat;
    }

    public int getNb_justificatifs() {
        return nb_justificatifs;
    }

    public void setNb_justificatifs(int nb_justificatifs) {
        this.nb_justificatifs = nb_justificatifs;
    }

    public float getMontant_valide() {
        return montant_valide;
    }

    public void setMontant_valide(float montant_valide) {
        this.montant_valide = montant_valide;
    }

    public Date getDate_modif() {
        return date_modif;
    }

    public void setDate_modif(Date date_modif) {
        this.date_modif = date_modif;
    }
}

它是嵌入的ID:

package Métier;

import javax.persistence.Embeddable;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.ManyToOne;
import java.io.Serializable;
import java.util.Objects;

@Embeddable
public class FicheFraisPK implements Serializable {
    @ManyToOne
    Visiteur visiteur;
    @Enumerated(EnumType.STRING)
    Mois mois;
    public FicheFraisPK() {

    }

    public FicheFraisPK(Visiteur vst, Mois ms) {
        this.visiteur = vst;
        this.mois = ms;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof FicheFraisPK)) return false;
        FicheFraisPK that = (FicheFraisPK) o;
        return Objects.equals(getVisiteur(), that.getVisiteur()) &&
                Objects.equals(getMois(), that.getMois());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getVisiteur(), getMois());
    }

    private Visiteur getVisiteur() {
        return visiteur;
    }

    private void setVisiteur(Visiteur visiteur) {
        this.visiteur = visiteur;
    }

    public Mois getMois() {
        return mois;
    }

    public void setMois(Mois mois) {
        this.mois = mois;
    }
}
ruyhziif

ruyhziif1#

尝试这样的Map:

@Entity
public class Visiteur {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false, nullable = false)
    public int VstId;
    private String adresse;
    private String code_postal;
    private String ville;
    @Temporal(TemporalType.DATE)
    private Date date_embauche;
    @OneToMany(mappedBy = "visiteur")
    private List<FicheFrais> fichesFrais = new ArrayList<FicheFrais>();
}
@Entity
public class FicheFrais implements Serializable {
    @Enumerated(EnumType.STRING)
    private Etat etat;

    @EmbeddedId
    private FicheFraisPK id;

    @ManyToOne
    @JoinColumn(name = "Visiteur_id", insertable = false, updatable = false)
    Visiteur visiteur;
    private int nb_justificatifs;
    private float montant_valide;
    @Temporal(TemporalType.DATE)
    private Date date_modif;
}
@Embeddable
public class FicheFraisPK implements Serializable {
    @Column(name = "Visiteur_id")
    int VstId;
    @Enumerated(EnumType.STRING)
    Mois mois;
}

相关问题