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
选项可能会导致编译错误。