Jakarta ee 在持久化子实体时获取重复行

Jakarta ee 在持久化子实体时获取重复行,jakarta-ee,jpa-2.0,oracle-adf,entitymanager,Jakarta Ee,Jpa 2.0,Oracle Adf,Entitymanager,我在实体Visite和Datevisite之间有一对多关系 当我持久化一个新的子对象时,我在数据库中得到了一个重复的行。这意味着当我持久化一个新的Datevisite时,我会在数据库中找到一个重复的行,但ID不同 有人能告诉我是什么错误吗 这是我的访问实体 package model.entitie; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; impor

我在实体
Visite
Datevisite
之间有一对多关系

当我持久化一个新的子对象时,我在数据库中得到了一个重复的行。这意味着当我持久化一个新的
Datevisite
时,我会在数据库中找到一个重复的行,但ID不同

有人能告诉我是什么错误吗

这是我的
访问
实体

package model.entitie;

import java.io.Serializable;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
@NamedQueries({ @NamedQuery(name = "Visite.findAll", query = "select o from Visite o") })
@SequenceGenerator(name = "Visite_Id_Seq_Gen", sequenceName = "VISITE_SEQ", allocationSize = 1, initialValue = 50)
public class Visite implements Serializable {
    private static final long serialVersionUID = 2402539910369717472L;
    @Column(length = 4000)
    public String client;
    @Column(name = "INGAFF", length = 4000)
    private String ingAff;
    @Column (name="MOISVISITE",length = 4000)
    private int moisviste;
    @Column(name = "PRBVISITE" ,length = 4000)
    private String prbvisite;
    @Column (name="ETAT",length=4000)
    private String etat;
    @Column (name="ANNEE",length=4000)
    private String annee;

    public void setAnnee(String annee) {
        this.annee = annee;
    }

    public String getAnnee() {
        return annee;
    }

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

    public String getEtat() {
        return etat;
    }

    public void setPrbvisite(String prbvisite) {
        this.prbvisite = prbvisite;
    }

    public String getPrbvisite() {
        return prbvisite;
    }

    public void setMoisviste(int moisviste) {
        this.moisviste = moisviste;
    }

    public int getMoisviste() {
        return moisviste;
    }


    public void setIngAff(String ingAff) {
        this.ingAff = ingAff;
    }

    public String getIngAff() {
        return ingAff;
    }
    @Column(length = 4000)
    private String dep;
    @Id
    @Column(nullable = false, length = 4000)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Visite_Id_Seq_Gen")
    private String idvisite;
    @Column(length = 4000)
    private String nbvisites;
    @OneToMany(mappedBy = "visite")
    private List<Intervention> interventionList;

    @OneToMany(mappedBy = "visite",cascade =CascadeType.ALL)
    private List<Datevisite> datevisiteList;

    public Visite() {
    }

    public Visite(String client, String dep, String idvisite, String nbvisites, String ingAff) {
        this.client = client;
        this.dep = dep;
        this.idvisite = idvisite;
        this.nbvisites = nbvisites;
        this.ingAff = ingAff;
    }

    public String getClient() {
        return client;
    }

    public void setClient(String client) {

        this.client = client;
    }

    public String getDep() {
        return dep;
    }

    public void setDep(String dep) {
        this.dep = dep;
    }

    public String getIdvisite() {
        return idvisite;
    }

    public void setIdvisite(String idvisite) {
        this.idvisite = idvisite;
    }

    public String getNbvisites() {
        return nbvisites;
    }

    public void setNbvisites(String nbvisites) {
        this.nbvisites = nbvisites;
    }
    public Intervention addIntervention(Intervention intervention) {
        getInterventionList().add(intervention);
        intervention.setVisite(this);
        return intervention;
    }

    public Datevisite addDatevisite(Datevisite datevisite) {
       getDatevisiteList().add(datevisite);
        datevisite.setVisite(this);
        return datevisite;
    }

    public List<Datevisite> getDatevisiteList() {
        return datevisiteList;
    }
    public List<Intervention> getInterventionList() {
        return interventionList;
    }

    public Intervention removeIntervention(Intervention intervention) {
        getInterventionList().remove(intervention);
        intervention.setDossier(null);
        return intervention;
    }

    public Datevisite removeDatevisite(Datevisite datevisite) {
        getDatevisiteList().remove(datevisite);
        datevisite.setVisite(null);
        return datevisite;
    }

    public void setDatevisiteList(List<Datevisite> datevisiteList) {
        this.datevisiteList = datevisiteList;
    }
    public void setInterventionList(List<Intervention> interventionList) {
        this.interventionList = interventionList;
    }

}
package model.entitie;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import model.entitie.Visite;

@Entity
@NamedQueries({ @NamedQuery(name = "Datevisite.findAll", query = "select o from Datevisite o") })
@SequenceGenerator(name = "DateVisite_Id_Seq_Gen", sequenceName = "DATEVISITE_SEQ", allocationSize = 1,
                   initialValue = 50)
public class Datevisite implements Serializable {
    @SuppressWarnings("compatibility:-1921858317195121496")
    private static final long serialVersionUID = -341535626783197699L;
    @Id
    @Column(nullable = false, length = 4000)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DateVisite_Id_Seq_Gen")
    private String iddatevis;

    @Column(name = "DESCRPTION")
    private String description;
    @Column(name = "CLIENTVISITE")
    private String ClientVisite;
    @Column(name = "DEPDV")
    private String depdv;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "VISITE_ID",insertable=false, updatable=false)
    private Visite visite;

    @Column(name="MOISDATEVIS")
    private String moisvisite;

    public void setMoisvisite(String moisvisite) {
        this.moisvisite = moisvisite;
    }

    public String getMoisvisite() {
        return moisvisite;
    }

    public void setAnneedatevisite(String anneedatevisite) {
        this.anneedatevisite = anneedatevisite;
    }

    public String getAnneedatevisite() {
        return anneedatevisite;
    }

    public void setNbvisited(String nbvisited) {
        this.nbvisited = nbvisited;
    }

    public String getNbvisited() {
        return nbvisited;
    }

    public void setIng(String ing) {
        this.ing = ing;
    }

    public String getIng() {
        return ing;
    }

    public void setEtatdatevisite(String etatdatevisite) {
        this.etatdatevisite = etatdatevisite;
    }

    public String getEtatdatevisite() {
        return etatdatevisite;
    }
    @Column(name="ANNEEDATEVISITE")
    private String anneedatevisite;
    @Column(name="NBVISITED")
    private String nbvisited;
    @Column(name="ING")
    private String ing;
    @Column(name="ETATDATEVISITE")
    private String etatdatevisite;

    public void setDepdv(String depdv) {
        this.depdv = depdv;
    }

    public String getDepdv() {
        return depdv;
    }

    public void setClientVisite(String ClientVisite) {
        this.ClientVisite = ClientVisite;
    }

    public String getClientVisite() {
        return ClientVisite;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public Datevisite() {
    }

    public Datevisite(String iddatevis, Visite visite, String ClientVisite, String depdv) {
        this.iddatevis = iddatevis;

        this.visite = visite;
        this.depdv = depdv;
        this.ClientVisite = ClientVisite;
    }

    public String getIddatevis() {
        return iddatevis;
    }

    public void setIddatevis(String iddatevis) {
        this.iddatevis = iddatevis;
    }

    public Visite getVisite() {
        return visite;
    }

    public void setVisite(Visite visite) {
        this.visite = visite;
    }
}
这里是我如何坚持我的孩子的实体

public Datevisite persistDatevisite(Datevisite datevisite) {

    datevisite.setDepdv(datevisite.getVisite().getDep());
    datevisite.setClientVisite(datevisite.getVisite().getClient());
    datevisite.setDescription(datevisite.getVisite().getPrbvisite());
    datevisite.setAnneedatevisite(datevisite.getVisite().getAnnee());
    datevisite.setNbvisited(datevisite.getVisite().getNbvisites());
    datevisite.setIng(datevisite.getVisite().getIngAff());
    datevisite.setEtatdatevisite(datevisite.getVisite().getEtat());

    em.persist(datevisite);

    return datevisite;
}

我认为问题在于
datevisite
对象

在您的
persistDatevisite()
方法中,您为它提供了一个类型为
Datevisite
的参数,称为
Datevisite
。您是否有理由调用
datevisite
的setter并将其设置为与之相同的值?(我的意思是你正在做
ObjectA.setFoo(ObjectA.getFoo())
。也许你应该区分你拥有的
datevisite
对象(可能是
this.datevisite

它可能看起来像这样:

this.datevisite.setDepdv(datevisite.getVisite().getDep());
或者:

datevisite.setDepdv(this.datevisite.getVisite().getDep());
取决于你想要得到什么

我也注意到你做了代码> E.Ac留存(DATEVITE)。考虑使用<代码>这个<代码>,就像我之前建议的一样。你也返回它的值(也就是说,你坚持它,然后返回它,但这可能没问题)。但是,可能是当你坚持它时,保存对象,并且当它被返回时。(这是一个疯狂的猜测)


希望它能起作用,如果您告诉我们您使用的是什么技术(编辑器、版本、.jar等),这将有所帮助.

在持久化新的
Datevisite
对象之前,您是如何创建它的?您的问题中似乎没有任何东西会导致数据从一个调用
persistDatevisite
复制到下一个调用,因此问题似乎出在别处。不,首先我持久化父对象(visite)比我坚持的孩子(datavisite)…我甚至尝试在持久化datevisite之前刷新实体,但始终存在相同的问题。请在将
datevisite
对象传递到
persistDatevisite
方法之前显示创建和填充该对象的代码。进一步看,您的子记录中的所有字段都被来自父记录的值覆盖除了
moisvisite
。您确定这是正确的吗?如果在调用
persistDatevisite
之前填充
moisvisite
字段,是否总是使用不同的值?如果是,您应该在该字段和ID字段中看到不同的值。其他所有内容都与父记录完全匹配,因为你让它复制那些值。是的,我需要在子expect moisvisite中复制这些值。它工作正常,希望每次我坚持时都能得到一个重复的行(我只得到重复的第一条记录)谢谢你的帮助…我想我开始理解这个问题了..当我持久化一个新的datevisite.it持久化缓存中的所有查询…我使用em.clear但结果总是一样这不是他所做的。他调用setter来填充从父记录中获取值的字段(
Visite
)。这有点不合常规,但并不是真的错。而且没有任何迹象表明method参数是包含
persistDatevisite
方法的对象的属性,因此
this
选项可能会导致编译错误。