无法锁定未保存的瞬态实例

时间:2018-11-27 08:44:00

标签: java

我在Java EE项目中遇到了问题。我不知道我的错误是什么。如果有人可以帮助我,我将非常感激。

这是问题所在:

    Caused by: org.hibernate.TransientObjectException: cannot lock an unsaved transient instance: com.carveras.escola.model.Alumne
at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:74)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:751)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:744)
at org.hibernate.internal.SessionImpl.access$1200(SessionImpl.java:204)
at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2682)
at com.carver_as.carverjsf.model.CarverPureHibernate5DAO.reattach(CarverPureHibernate5DAO.java:438)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206)
at com.sun.proxy.$Proxy126.reattach(Unknown Source)
at com.carveras.escola.web.EditaPersonaBean.init(EditaPersonaBean.java:55)
... 82 more

2 个答案:

答案 0 :(得分:1)

异常消息清楚地表明,您不能锁定数据库中尚不存在的对象(此类对象称为Transient)。 lock()调用将锁定数据库中的行。您正在尝试锁定一个临时对象,这意味着Hibernate甚至不知道该对象在数据库中是否具有相应的行。

答案 1 :(得分:0)

来自Hibernate documentation

  

瞬态-如果对象刚刚被实例化,则该对象是瞬态的   使用new运算符,并且它不与Hibernate关联   会话。它在数据库中没有持久性表示,也没有   标识符值已分配。瞬态实例将是   如果应用程序不保存   参考了。使用休眠会话制作对象   持久的(让Hibernate处理那些   为此转换需要执行)。

这意味着您需要做类似的事情

Long id = (Long) session.save(myObject);

以便hibernate知道该对象(与Hibernate会话相关联)并保存在数据库中