持久化数据错误无法设置 int 字段

问题描述

我必须创建一个 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”的表,该表有一个复合键(使用 Embeddable 注释创建),其中引用了访问者(具有 ManyToOne 关联)

根本没有查询,我只是想保留一个 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(与访问者链接):

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;
    }
}

它是 EmbeddedId :

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;
    }
}

解决方法

尝试这样的映射:

@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;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...