session.evict()

时间:2015-09-22 11:35:08

标签: java entity-framework hibernate

我尝试使用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

1 个答案:

答案 0 :(得分:0)

只是一个假设,但我看到你的代码和这个

MyEntity old =(MyEntity)session.get(clazz,compositeKey);

<强> session.evict(旧);

old.setVersion(entity.getVersion()); old.setSysBis(new Timestamp(timestamp));

<强>了Session.update(旧);

如何更新你驱逐的对象,这很奇怪吗?我认为可以这样,尝试删除逐出,因为你需要在保存时使用逐出