2015-09-21 2 views
0

У меня есть отношение «один ко многим» между объектами Visite и Datevisite.Получение дублированных строк при сохранении дочернего объекта

Я получаю дубликат строки в базе данных, когда я сохраняю новый ребенок. Это означает, что когда я сохраняю новый Datevisite, я нахожу дублирующую строку в базе данных, но с идентификатором differet.

Может кто-нибудь сказать мне, что за ошибка?

вот мой 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; 
} 
+0

Как вы * создаете * новый объект 'Datevisite', прежде чем вы его сохраняете? В вашем вопросе не возникает ничего похожего на то, что это должно приводить к дублированию данных из одного вызова 'persistDatevisite' к следующему, так что кажется, что проблема в другом месте. –

+0

Вначале я не сохраняю родителя (visite), чем я сохраняю ребенка (datavisite) .. Я попытался смыть сущность перед сохранением datevisite и всегда с той же проблемой – user3419507

+0

Пожалуйста, покажите код, который создает и заполняет объект 'Datevisite' перед этим передается методу 'persistDatevisite'. –

ответ

0

Я считаю, что проблема с 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 и т. Д.).

+1

благодарю вас за помощь ... я думаю, что начал понимать проблему..когда я сохраняю новый datevisite.it, сохраняю весь запрос в кеше ... i user em.clear, но тот же результат всегда – user3419507

+0

Это не то, что он делает. Он вызывает сеттеры для заполнения полей, которые берут свое значение из записи * parent * ('Visite'). Это немного неортодоксально, но на самом деле это не так. И нет ничего, чтобы предположить, что параметр метода является свойством объекта, содержащего метод 'persistDatevisite', поэтому параметр' this', вероятно, приведет к ошибке компиляции. –