我必须创建一个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;
}
}
1条答案
按热度按时间ruyhziif1#
尝试这样的Map: