【问题标题】:Getting duplicated rows when persisting a child entity持久化子实体时获取重复行
【发布时间】:2015-12-18 06:49:02
【问题描述】:

我在实体 VisiteDatevisite 之间存在一对多关系。

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

谁能告诉我错误是什么?

这是我的Visite 实体

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

}

这是我的Datevisite 实体

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 对象传递给persistDatevisite 方法之前显示创建和填充对象的代码。
  • 进一步观察,您的子记录中的所有字段都将被父级除了 moisvisite 的值覆盖。你确定这是正确的吗?如果在调用persistDatevisite 之前填充moisvisite 字段,您是否总是使用不同的值?如果是,您应该在该字段和 ID 字段中看到不同的值。其他所有内容都与父记录完全匹配,因为您告诉它复制这些值。
  • 是的,我需要将这些值复制到孩子中,期望 moisvisite.it'working 很好,期望我每次坚持时都会得到一个重复的行(我得到的第一条记录只重复)

标签: jakarta-ee jpa-2.0 oracle-adf entitymanager


【解决方案1】:

我认为问题出在datevisite 对象上。

在你的persistDatevisite() 方法中,你给它一个Datevisite 类型的参数,称为datevisite。你有理由调用datevisite 的设置器并将它们设置为相同的值吗? (我的意思是你正在做ObjectA.setFoo(ObjectA.getFoo())。也许你应该区分你拥有的datevisite 对象(也许是this.datevisite?)。

它可能看起来像这样:

this.datevisite.setDepdv(datevisite.getVisite().getDep());

也可以:

datevisite.setDepdv(this.datevisite.getVisite().getDep());

取决于你想得到什么。

我还注意到您使用em.persist(datevisite)。考虑使用this,就像我之前建议的那样。您还返回了它的值(也就是说,您将它持久化然后返回它,但这可能没问题)。但是,当您持久保存它时,可能会保存对象,并且在返回时也会保存(疯狂猜测这个)。

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

【讨论】:

  • 谢谢你的帮助......我想我开始理解这个问题了......当我坚持一个新的 datevisite.it 坚持缓存中的所有查询......我用户 em.clear 但相同结果总是
  • 这不是他正在做的事情。他正在调用 setter 来填充从 parent 记录 (Visite) 中获取值的字段。这有点不正统,但并没有真正的错误。而且没有任何迹象表明method参数是包含persistDatevisite方法的对象的属性,所以this选项可能会导致编译错误。
猜你喜欢
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多