簡體   English   中英

org.hibernate.PersistentObjectException:分離的實體被傳遞以持久保存在新對象上

[英]org.hibernate.PersistentObjectException: detached entity passed to persist on new Object

我知道這些線程很多,但是它們的解決方案對我來說都不起作用。

public void process(EreignisTexteSpezifikationEingang spezifikationEingang) throws BusinessException {

        String eingangBaureiheBauart = spezifikationEingang.getBaureiheBauart();
        String eingangSoftwareVersion = spezifikationEingang.getSoftwareVersion();
        boolean eingangIsDeault = spezifikationEingang.getIsDefault();
        AnlageStatus anlageStatus = spezifikationEingang.getAnlageStatus();

        Assert.argNotNull(spezifikationEingang, "EreignisTexteSpezifikationEingang");
        Assert.argNotNull(eingangBaureiheBauart, "BaureiheBauart");
        Assert.argNotNull(eingangSoftwareVersion, "Software Version");
        Assert.argNotNull(spezifikationEingang.getInputStream(), "texteInputStream");

        checkExistDefaultVersionForBR(eingangBaureiheBauart, eingangIsDeault);

        EreignisSpezifikation newSpez = new EreignisSpezifikation();
        newSpez.setAnlageDatum(new Date());
    newSpez.setSoftwareVersion(eingangSoftwareVersion);
    newSpez.setIsDefault(eingangIsDeault);
    newSpez.setBemerkung(spezifikationEingang.getBemerkung());

    if (AnlageStatus.UNDEFINED.equals(anlageStatus) || null == anlageStatus) {
        newSpez.setStatus(AnlageStatus.VERFUEGBAR);
    } else {
        newSpez.setStatus(anlageStatus);
    }

    BaureiheBauart baureiheBauart = bauartDao.findByName(eingangBaureiheBauart);
    newSpez.setBaureiheBauart(baureiheBauart);
    if (baureiheBauart == null) {
        throw InvalidEreignisSpezifikationException.invalidBaureihe(eingangBaureiheBauart, spezifikationEingang
                .getFilename());
    }

    EreignisTexteParser parser = parserFactory.getEreignistexteParser();

    List<Ereignistext> texte = parser.parse(spezifikationEingang.getInputStream());

    newSpez.setEreignistexte(texte);

        ereignisSpezifikationDao.makePersistent(newSpez);

EreignisSpezifikation:

    ...
    @Id
    @Column(name = "PK_EREIGNIS_SPEZ")
    @SequenceGenerator(name = "EreignisSpezSequence", sequenceName = "SEQ_EREIGNIS_SPEZIFIKATION", allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EreignisSpezSequence")
    private Long id;

    ...
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "FK_EREIGNIS_SPEZ", nullable = false)
    List<Ereignistext> ereignistexte;

序列的最后一個索引是189,未設置。

我已經嘗試過將CascadeType更改為Merge,但是什么也沒有改變。

該對象絕對不在數據庫中,但仍然會失敗。 有任何想法嗎?

堆:

 at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
 at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:762)
 at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:755)
 at org.hibernate.ejb.engine.spi.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:53)
 at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:396)
 at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:339)
 at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:207)
 at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:426)
 at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:366)
 at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:342)
 at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:207)
 at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:164)
 at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:449)
 at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
 at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
 at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135)
 at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
 at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
 at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
 at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
 at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:772)
 at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746)
 at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:750)
 at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875)
 at org.jboss.as.jpa.container.AbstractEntityManager.persist(AbstractEntityManager.java:563)
 at de.db.udg.diagnose.udgdiag.dao.GenericDAOJpa.makePersistent(GenericDAOJpa.java:44)
    ...

例外明確指出:

傳遞給新對象的分離實體

您的問題是您正在設置從spezifikationEingang對象獲取的某些屬性到newSpez對象。對於休眠狀態,這些對象沒有持久化,因為它們尚未在當前會話上下文中加載。

例如以下幾行:

List<Ereignistext> texte = parser.parse(spezifikationEingang.getInputStream());

newSpez.setEreignistexte(texte);

您正在嘗試將texte設置為newSpez對象,而它是一個非持久List ,因為您剛剛通過parser.parse()調用創建了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM