我尝试使用hibernate更新实体并继续接收此异常:
Caused by: java.lang.NullPointerException
at org.hibernate.pretty.MessageHelper.collectionInfoString(MessageHelper.java:275) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.EvictVisitor.evictCollection(EvictVisitor.java:80) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.EvictVisitor.evictCollection(EvictVisitor.java:74) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.EvictVisitor.processCollection(EvictVisitor.java:56) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.AbstractVisitor.process(AbstractVisitor.java:143) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.DefaultEvictEventListener.doEvict(DefaultEvictEventListener.java:136) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.event.internal.DefaultEvictEventListener.onEvict(DefaultEvictEventListener.java:97) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.internal.SessionImpl.fireEvict(SessionImpl.java:1194) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at org.hibernate.internal.SessionImpl.evict(SessionImpl.java:1187) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
at sun.reflect.GeneratedMethodAccessor291.invoke(Unknown Source) [:1.7.0_40]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_40]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_40]
at org.jboss.as.jpa.container.EntityManagerUnwrappedTargetInvocationHandler.invoke(EntityManagerUnwrappedTargetInvocationHandler.java:61) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at com.sun.proxy.$Proxy58.evict(Unknown Source)
当我们更新实体时,我们会生成这样的副本(历史记录):
session.evict(entity)
;
MyEntity old = (MyEntity) session.get(clazz, compositeKey);
session.evict(old);
old.setVersion(entity.getVersion());
old.setSysBis(new Timestamp(timestamp));
session.update(old);
entity.setSysFrom(new Timestamp(timestamp));
entity.setSysTo(new Timestamp(HibernateUtil.MAX_SYS_BIS));
entity.setBearbeiter(user);
session.save(entity);
如您所见,我正在使用我的实体的复合键。
另一件事
应更新的实体包含@OneToMany
关系。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "myEntity")
public Set<MyOtherEntity> getMyOtherEntity() {
return ravBetraege;
}
myEntity所
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "RAV005_BNR15", referencedColumnName = "RAV001_BNR15", insertable = false, updatable = false),
@JoinColumn(name = "RAV005_RAV_LFDNR", referencedColumnName = "RAV001_RAV_LFDNR", insertable = false, updatable = false),
@JoinColumn(name = "RAV005_HH_JAHR", referencedColumnName = "RAV001_HH_JAHR", insertable = false, updatable = false),
@JoinColumn(name = "RAV005_BEZUGNR_ZAHLUNG", referencedColumnName = "RAV001_BEZUGNR_ZAHLUNG", insertable = false, updatable = false),
@JoinColumn(name = "RAV005_SYS_BIS", referencedColumnName = "RAV001_SYS_BIS", insertable = false, updatable = false) })
public MyEntity getMyEntity() {
return this.myEntity;
}
@JoinColumOrFormula
注释引用的某些列是复合键的一部分,而其他列则不是。
如果您需要任何进一步的信息,请询问。
希望有人知道如何解决这个问题。
修改
@Entity
@Table(name = "RAV001_RAVSTAMMSATZ_DA_TB", schema = "XYZ")
@SequenceGenerator(sequenceName = "XYZ.RAV001_id_sq", name = "RAV001_gen", allocationSize = 10)
public class Ravstammsatz extends Changeable implements LbdEntity {
private static final long serialVersionUID = 1L;
private BuchungsIdent buchungsIdent = new BuchungsIdent();
/**
* Attribute id.
*/
private Long id;
/**
* Attribute btnr.
*/
private String btnr;
/**
* Attribute ravLfdnr.
*/
private Integer ravLfdnr;
/**
* Attribute forderungStatus.
*/
private Integer forderungsStatus;
/**
* Attribute hBearbeiter.
*/
private String hBearbeiter;
/**
* Attribute bearbeiter.
*/
private String bearbeiter;
/**
* Attribute sysVon.
*/
private Timestamp sysVon;
/**
* Attribute sysBis.
*/
private Timestamp sysBis;
/**
* Attribute version.
*/
private Long version;
/**
*
*/
private Set<Rav2z2betrag> ravBetraege = new HashSet<>();
/**
* @return id
*/
@Basic
@GeneratedValue(generator = "RAV001_gen")
@Column(name = "RAV001_ID")
public Long getId() {
return id;
}
/**
* @param id
* new value for id
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the buchungsIdent
*/
@EmbeddedId
@AttributeOverrides({ @AttributeOverride(name = "antragsjahr", column = @Column(name = "RAV001_MELDEJAHR")),
@AttributeOverride(name = "antragstellernummer", column = @Column(name = "RAV001_BNR15")),
@AttributeOverride(name = "bezugNrZahlung", column = @Column(name = "RAV001_BEZUGNR_ZAHLUNG")),
@AttributeOverride(name = "foerderverfahren", column = @Column(name = "RAV001_VERFINDEX")),
@AttributeOverride(name = "sysBis", column = @Column(name = "RAV001_SYS_BIS")),
@AttributeOverride(name = "lfdNrBerechnung", column = @Column(name = "RAV001_RAV_LFDNR")) })
public BuchungsIdent getBuchungsIdent() {
return buchungsIdent;
}
/**
* @param buchungsIdent
* the buchungsIdent to set
*/
public void setBuchungsIdent(BuchungsIdent buchungsIdent) {
this.buchungsIdent = buchungsIdent;
}
/**
* @return hhJahr
*/
@Basic
@Column(name = "RAV001_HH_JAHR")
public Integer getHhJahr() {
return data.getHhJahr();
}
/**
* @param hhJahr
* new value for hhJahr
*/
public void setHhJahr(Integer hhJahr) {
this.data.setHhJahr(hhJahr);
}
/**
* @return the bezugnrZahlungProfil
*/
@Basic
@Column(name = "RAV001_BEZUGNR_ZAHLUNG_PROFIL", length = 11)
public String getBezugnrZahlungProfil() {
return data.getBezugnrZahlungProfil();
}
/**
* @param bezugnrZahlungProfil
* the bezugnrZahlungProfil to set
*/
public void setBezugnrZahlungProfil(String bezugnrZahlungProfil) {
this.data.setBezugnrZahlungProfil(bezugnrZahlungProfil);
}
/**
* @return bezugnrZahlung
*/
@Column(name = "RAV001_BEZUGNR_ZAHLUNG", length = 11, insertable = false, updatable = false)
public String getBezugnrZahlung() {
return data.getBezugnrZahlung();
}
/**
* @param bezugnrZahlung
* new value for bezugnrZahlung
*/
public void setBezugnrZahlung(String bezugnrZahlung) {
this.data.setBezugnrZahlung(bezugnrZahlung);
this.buchungsIdent.setBezugNrZahlung(bezugnrZahlung);
}
/**
* @return btnr
*/
@Basic
@Column(name = "RAV001_BTNR", length = 16)
public String getBtnr() {
return btnr;
}
/**
* @param btnr
* new value for btnr
*/
public void setBtnr(String btnr) {
this.btnr = btnr;
}
/**
* @return egflNr
*/
@Basic
@Column(name = "RAV001_EGFL_NR", length = 15)
public String getEgflNr() {
return data.getEgflNr();
}
/**
* @param egflNr
* new value for egflNr
*/
public void setEgflNr(String egflNr) {
this.data.setEgflNr(egflNr);
}
/**
* @return ravLfdnr
*/
@Column(name = "RAV001_RAV_LFDNR", insertable = false, updatable = false)
public Integer getRavLfdnr() {
return ravLfdnr;
}
/**
* @param ravLfdnr
* new value for ravLfdnr
*/
public void setRavLfdnr(Integer ravLfdnr) {
this.ravLfdnr = ravLfdnr;
this.buchungsIdent.setLfdNrBerechnung(ravLfdnr);
}
/**
* @return status
*/
@Basic
@Column(name = "RAV001_STATUS")
public Integer getStatus() {
return data.getStatus();
}
/**
* @param status
* new value for status
*/
public void setStatus(Integer status) {
this.data.setStatus(status);
}
/**
* @return bnr15
*/
@Column(name = "RAV001_BNR15", length = 15, insertable = false, updatable = false)
public String getBnr15() {
return data.getBnr15();
}
/**
* @param bnr15
* new value for bnr15
*/
public void setBnr15(String bnr15) {
this.data.setBnr15(bnr15);
this.buchungsIdent.setAntragstellernummer(bnr15);
}
/**
* @return lfdnrZahlliste
*/
@Basic
@Column(name = "RAV001_LFDNR_ZAHLLISTE")
public Integer getLfdnrZahlliste() {
return data.getLfdnrZahlliste();
}
/**
* @param lfdnrZahlliste
* new value for lfdnrZahlliste
*/
public void setLfdnrZahlliste(Integer lfdnrZahlliste) {
this.data.setLfdnrZahlliste(lfdnrZahlliste);
}
/**
* @return lfdnrBerechnung
*/
@Column(name = "RAV001_LFDNR_BERECHNUNG")
public Integer getLfdnrBerechnung() {
return data.getLfdnrBerechnung();
}
/**
* @param lfdnrBerechnung
* new value for lfdnrBerechnung
*/
public void setLfdnrBerechnung(Integer lfdnrBerechnung) {
this.data.setLfdnrBerechnung(lfdnrBerechnung);
}
/**
* @return meldejahr
*/
@Basic
@Column(name = "RAV001_MELDEJAHR", insertable = false, updatable = false)
public Integer getMeldejahr() {
return data.getMeldejahr();
}
/**
* @param meldejahr
* new value for meldejahr
*/
public void setMeldejahr(Integer meldejahr) {
this.data.setMeldejahr(meldejahr);
this.buchungsIdent.setAntragsjahr(meldejahr);
}
/**
* @return fpEu
*/
@Basic
@Column(name = "RAV001_FP_EU", length = 5)
public String getFpEu() {
return data.getFpEu();
}
/**
* @param fpEu
* new value for fpEu
*/
public void setFpEu(String fpEu) {
this.data.setFpEu(fpEu);
}
/**
* @return verfindex
*/
@Column(name = "RAV001_VERFINDEX", insertable = false, updatable = false)
public Integer getVerfindex() {
return data.getVerfindex();
}
/**
* @param verfindex
* new value for verfindex
*/
public void setVerfindex(Integer verfindex) {
this.data.setVerfindex(verfindex);
this.buchungsIdent.setFoerderverfahren(verfindex);
}
/**
* @return the zahlungBes
*/
@Basic
@Column(name = "RAV001_ZAHLUNGS_BES")
public Integer getZahlungsBes() {
return data.getZahlungsBes();
}
/**
* @param zahlungsBes
* the zahlungBes to set
*/
public void setZahlungsBes(Integer zahlungsBes) {
this.data.setZahlungsBes(zahlungsBes);
}
/**
* @return datumBuchung
*/
@Basic
@Column(name = "RAV001_DATUM_PEB")
public Date getDatumPeb() {
return data.getDatumPeb();
}
/**
* @param data
* .getDatumBuchung() new value for datumBuchung
*/
public void setDatumPeb(Date datumPeb) {
this.data.setDatumPeb(datumPeb);
}
/**
* @return datumBuchung
*/
@Basic
@Column(name = "RAV001_DATUM_BUCHUNG")
public Date getDatumBuchung() {
return data.getDatumBuchung();
}
/**
* @param datumBuchung
* new value for datumBuchung
*/
public void setDatumBuchung(Date datumBuchung) {
this.data.setDatumBuchung(datumBuchung);
}
/**
* @return datumZahlung
*/
@Basic
@Column(name = "RAV001_DATUM_ZAHLUNG")
public Date getDatumZahlung() {
return data.getDatumZahlung();
}
/**
* @param datumZahlung
* new value for datumZahlung
*/
public void setDatumZahlung(Date datumZahlung) {
this.data.setDatumZahlung(datumZahlung);
}
/**
* @return kasseKz
*/
@Basic
@Column(name = "RAV001_KASSE_KZ")
public String getKasseKz() {
return data.getKasseKz();
}
/**
* @param kasseKz
* new value for kasseKz
*/
public void setKasseKz(String kasseKz) {
this.data.setKasseKz(kasseKz);
}
@Basic
@Column(name = "RAV001_KASSE_KZ_I")
public Integer getKasse() {
return data.getKasse();
}
/**
* @param kasse
* new value for kasse
*/
public void setKasse(Integer kasse) {
this.data.setKasse(kasse);
}
/**
* @return zahlungsart
*/
@Basic
@Column(name = "RAV001_ZAHLUNGSART")
public Integer getZahlungsart() {
return data.getZahlungsart();
}
/**
* @param zahlungsart
* new value for zahlungsart
*/
public void setZahlungsart(Integer zahlungsart) {
this.data.setZahlungsart(zahlungsart);
}
/**
* @return bewStelle
*/
@Basic
@Column(name = "RAV001_BEW_STELLE", length = 3)
public String getBewStelle() {
return data.getBewStelle();
}
/**
* @param bewStelle
* new value for bewStelle
*/
public void setBewStelle(String bewStelle) {
this.data.setBewStelle(bewStelle);
}
/**
* @return herkunft
*/
@Basic
@Column(name = "RAV001_HERKUNFT", length = 1)
public String getHerkunft() {
return data.getHerkunft();
}
/**
* @param herkunft
* new value for herkunft
*/
public void setHerkunft(String herkunft) {
this.data.setHerkunft(herkunft);
}
/**
* @return sysBisSatzart
*/
@Basic
@Column(name = "RAV001_SYS_BIS_SATZART", length = 1)
public String getSysBisSatzart() {
return data.getSysBisSatzart();
}
/**
* @param sysBisSatzart
* new value for sysBisSatzart
*/
public void setSysBisSatzart(String sysBisSatzart) {
this.data.setSysBisSatzart(sysBisSatzart);
}
/**
* @return stornoDatum
*/
@Basic
@Column(name = "RAV001_STORNO_DATUM")
public Timestamp getStornoDatum() {
return data.getStornoDatum();
}
/**
* @param stornoDatum
* new value for stornoDatum
*/
public void setStornoDatum(Timestamp stornoDatum) {
this.data.setStornoDatum(stornoDatum);
}
/**
* @return stornoGrund
*/
@Basic
@Column(name = "RAV001_STORNO_GRUND")
public Integer getStornoGrund() {
return data.getStornoGrund();
}
/**
* @param stornoGrund
* new value for stornoGrund
*/
public void setStornoGrund(Integer stornoGrund) {
this.data.setStornoGrund(stornoGrund);
}
/**
* @return hBearbeiter
*/
@Basic
@Column(name = "RAV001_H_BEARBEITER", length = 16)
public String getHBearbeiter() {
return hBearbeiter;
}
/**
* @param hBearbeiter
* new value for hBearbeiter
*/
public void setHBearbeiter(String hBearbeiter) {
this.hBearbeiter = hBearbeiter;
}
/**
* @return bearbeiter
*/
@Basic
@Column(name = "RAV001_BEARBEITER", length = 16)
public String getBearbeiter() {
return bearbeiter;
}
/**
* @param bearbeiter
* new value for bearbeiter
*/
public void setBearbeiter(String bearbeiter) {
this.bearbeiter = bearbeiter;
}
/**
* @return sysVon
*/
@Basic
@Column(name = "RAV001_SYS_VON")
public Timestamp getSysVon() {
return sysVon;
}
/**
* @param sysVon
* new value for sysVon
*/
public void setSysVon(Timestamp sysVon) {
this.sysVon = sysVon;
}
/**
* @return sysBis
*/
@Basic
@Column(name = "RAV001_SYS_BIS", insertable = false, updatable = false)
public Timestamp getSysBis() {
return sysBis;
}
/**
* @param sysBis
* new value for sysBis
*/
public void setSysBis(Timestamp sysBis) {
this.sysBis = sysBis;
this.buchungsIdent.setSysBis(sysBis);
}
/**
* @return idZahlmappeProfil
*/
@Basic
@Column(name = "RAV001_ID_ZAHLMAPPE_PROFIL")
public Long getIdZahlmappeProfil() {
return data.getIdZahlmappeProfil();
}
/**
* @param idZahlmappeProfil
* new value for idZahlmappeProfil
*/
public void setIdZahlmappeProfil(Long idZahlmappeProfil) {
this.data.setIdZahlmappeProfil(idZahlmappeProfil);
}
/**
* @param forderungBeglichen
* the forderungBeglichen to set
*/
public void setForderungsStatus(Integer forderungStatus) {
this.forderungsStatus = forderungStatus;
}
/**
* @return the forderungBeglichen
*/
@Basic
@Column(name = "RAV001_FORDERUNGS_STATUS")
public Integer getForderungsStatus() {
return forderungsStatus;
}
/**
* @return version
*/
@Version
@Column(name = "RAV001_VERSION")
public Long getVersion() {
return version;
}
/**
* @param version
* new value for version
*/
public void setVersion(Long version) {
this.version = version;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ravStammsatz")
public Set<Rav2z2betrag> getRavBetraege() {
return ravBetraege;
}
public void setRavBetraege(Set<Rav2z2betrag> ravBetraege) {
this.ravBetraege = ravBetraege;
}
}
修改2
我发现了:
ownerKey = session.getPersistenceContext()
.getEntry( collection.getOwner() ).getId();
MessageHelper:275
获得NullPointerException
,因为getEntry()
返回null
。
答案 0 :(得分:0)
只是一个假设,但我看到你的代码和这个
MyEntity old =(MyEntity)session.get(clazz,compositeKey);
<强> session.evict(旧); 强>
old.setVersion(entity.getVersion()); old.setSysBis(new Timestamp(timestamp));
<强>了Session.update(旧); 强>
如何更新你驱逐的对象,这很奇怪吗?我认为可以这样,尝试删除逐出,因为你需要在保存时使用逐出