Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA和Hibernate:UnuniqueObjectException。不明白原因_Java_Hibernate - Fatal编程技术网

Java JPA和Hibernate:UnuniqueObjectException。不明白原因

Java JPA和Hibernate:UnuniqueObjectException。不明白原因,java,hibernate,Java,Hibernate,我遇到了一个问题,大家都在讨论这个问题。在这种情况下,我仍然不理解背后的原因: org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[model.Asset#AMZN] @Entity @Table public class Asset extends Base { @Id @Column(name = "symbol") private String symbol; ...

我遇到了一个问题,大家都在讨论这个问题。在这种情况下,我仍然不理解背后的原因:

org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[model.Asset#AMZN]

@Entity
@Table
public class Asset extends Base {
    @Id
    @Column(name = "symbol")
    private String symbol;
    ...

    @Deprecated
    Asset(){}

    public Asset(String symbol) {
        this.symbol = symbol;
    }
    
    public String getSymbol() {
        return symbol;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Asset asset = (Asset) o;

        return symbol.equals(asset.symbol);
    }

    @Override
    public int hashCode() {
        return symbol.hashCode();
    }
}
即使存在另一个对象,它仍然具有相同的ID,不是吗?我的equals方法比较我资产的符号。如果两个物体的符号相同,那么物体本身也是一样的吗?所以我想知道为什么这个例外首先存在

进一步资料。我在这里使用资产的例子如下:

public class Trade{
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "symbol")
    private Asset asset;

    ...
}
public synchronized void persist(Object item){
        if(!PERSIST_ENABLE) return;
        Session session = sessionFactory.getCurrentSession();
        try{
            session.beginTransaction();
            session.saveOrUpdate(item);
            session.getTransaction().commit();
        }catch (Exception e){
            //This triggers all the time
            logger.error("Error persisting data. Rolling back transaction\n",e);
            session.getTransaction().rollback();
        }finally {
            session.close();
        }
    }
我还有一个类别仓库,它可以包含多个交易,每个交易都与上述资产相关:

public class Depot{
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "depot_id")
    @Fetch(FetchMode.SUBSELECT)
    private final Set<Trade> trades= new HashSet<>();
}
Asset是两个类中的一个,其中unonqueObjectException。我需要理解为什么

编辑:

完全堆栈跟踪

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.hoehlsoft.model.Asset#AMZN]
    at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:696)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:287)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:532)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:463)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:426)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:532)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:463)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:426)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:604)
    at jdk.internal.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:351)
    at com.sun.proxy.$Proxy55.saveOrUpdate(Unknown Source)
    at database.Db.persist(Db.java:46)
    at Trader.process(Trader.java:235)
    at Trader.onNewQuoteReceived(Trader.java:100)
    at Main.lambda$new$0(Main.java:30)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
还有课堂(很好,是其中的一部分)


您似乎有两个相等的资产(一个是mAsset,另一个是mDepot.trades…asset),但它们是不同的对象(即asset1!=asset2)。持久化交易者打开包含对象的级联持久化,但实际上Hibernate关注具有相同ID的两个不同对象

显示org.Hibernate.ununiqueObjectException的堆栈跟踪和周围的代码。使用StackTrace更新
//加载内容,但从不接触mAsset(这是最终结果,因此始终是从db加载的对象)
表示您,但Hibernate告诉您,事实并非如此。不,事实并非如此。我可以将
final
关键字添加到
mAsset
中,并且不会发生编译器错误(除了所需的空构造函数的错误)。因此,我不创建新对象。另外,如果符号相同,那么具有相同SYMBOL的两个资产如何可以是不同的对象如果符号相同,则equals返回true?顺便说一句,fetch=FetchType。EAGER这是一种代码气味。为什么需要EAGER?确实,这两个资产都引用了一个资产,但它是相同的。当我从数据库加载数据时,我只加载Trader(级联加载所有需要/渴望的东西)…但是如果加载第二个资产,它应该休眠,而不是足够聪明地看到它们是相同的(相同的PK?)。解决方法是什么?Hibernate是否真的使用对象标识而不是相等?加载和保存是两种不同的情况。加载时,资产引用的是同一个对象。但是,Hibernate不够聪明,无法在保存时检查不同对象的嵌套级联的相等性。
org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.hoehlsoft.model.Asset#AMZN]
    at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:696)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:287)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:532)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:463)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:426)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:532)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:463)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:426)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:499)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:423)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:616)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:609)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:604)
    at jdk.internal.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:351)
    at com.sun.proxy.$Proxy55.saveOrUpdate(Unknown Source)
    at database.Db.persist(Db.java:46)
    at Trader.process(Trader.java:235)
    at Trader.onNewQuoteReceived(Trader.java:100)
    at Main.lambda$new$0(Main.java:30)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
public class Trader{
    @JoinColumn(name = "symbol")
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    protected Asset mAsset;

    @JoinColumn(name = "depot_id")
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    protected Depot mDepot;
    ...

    protected synchronized void process(Quote quote) {
    //Does loads of stuff but never touches the mAsset (that is final, so it always is the object loaded from db)
    //This is where it crashes
    if (oldState != mState) Db.access().persist(this);
    }