Hibernate 对象引用未保存的临时实例-在刷新之前保存临时实例,同时尝试在@ManyToOne关系上设置null
我试图在db中持久化实体,如下图所示。它被简化为指出出现的问题:Hibernate 对象引用未保存的临时实例-在刷新之前保存临时实例,同时尝试在@ManyToOne关系上设置null,hibernate,jpa,null,playframework-2.2,detach,Hibernate,Jpa,Null,Playframework 2.2,Detach,我试图在db中持久化实体,如下图所示。它被简化为指出出现的问题: @Entity public class Entity { public @Id int id; public String description @ManyToOne(cascade=CascadeType.MERGE, optional=true, fetch=FetchType.LAZY) public User user; persistToDB() { //id generated by db;
@Entity
public class Entity {
public @Id int id;
public String description
@ManyToOne(cascade=CascadeType.MERGE, optional=true, fetch=FetchType.LAZY)
public User user;
persistToDB() {
//id generated by db;
this.description= "test description";
this.user = null;
JPA.em().persist(this);
}
}
它应该有用,但当我尝试时它失败了。我得到一个错误:
object references an unsaved transient instance - save the transient instance before flushing
以下是整个堆栈跟踪:
play.api.Application$$anon$1: Execution exception[[RollbackException: Error while committing the transaction]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.4.jar:2.2.4]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.4.jar:2.2.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:260) [play_2.10-2.2.4.jar:2.2.4]
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) [scala-library.jar:na]
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) [scala-library.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library.jar:na]
at play.api.libs.iteratee.Execution$$anon$1.execute(Execution.scala:43) [play-iteratees_2.10-2.2.4.jar:2.2.4]
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [scala-library.jar:na]
at scala.concurrent.Promise$class.complete(Promise.scala:55) [scala-library.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [scala-library.jar:na]
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library.jar:na]
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361) [scala-library.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library.jar:na]
Caused by: javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:92) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
at play.db.jpa.JPA$2.apply(JPA.java:190) ~[play-java-jpa_2.10-2.2.4.jar:2.2.4]
at play.core.j.FPromiseHelper$$anonfun$map$1.apply(FPromiseHelper.scala:79) ~[play_2.10-2.2.4.jar:2.2.4]
at scala.util.Success$$anonfun$map$1.apply(Try.scala:206) ~[scala-library.jar:na]
at scala.util.Try$.apply(Try.scala:161) ~[scala-library.jar:na]
at scala.util.Success.map(Try.scala:206) ~[scala-library.jar:na]
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library.jar:na]
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library.jar:na]
at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37) ~[play_2.10-2.2.4.jar:2.2.4]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) ~[akka-actor_2.10-2.2.0.jar:2.2.0]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) ~[akka-actor_2.10-2.2.0.jar:2.2.0]
... 4 common frames omitted
Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: models.InconsistencyRegistry.personResponsibleForRemoval -> models.User
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1384) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
... 15 common frames omitted
Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: models.InconsistencyRegistry.personResponsibleForRemoval -> models.User
at org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:380) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:176) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:161) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:152) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1212) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:400) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) ~[hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75) ~[hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
... 15 common frames omitted
若我将用数据库中已经存在的数据填充用户对象,那个么每个人都认为这很有用,但有时我需要将live user留空并将null插入数据库
顺便说一下,我使用PlayFramework2.2.4和JPA/hibernate来实现这一点
有人能帮我吗
-编辑-
全班:
主要实体:
@Entity
public class InconsistencyRegistry extends Generic<InconsistencyRegistry> {
@Required
@DateTime(pattern = "YYYY-MM-DD")
public String ascertainDate;
@Required
@ManyToOne(cascade = CascadeType.MERGE)
public InconsistencyOrigin origin;
/** The customer. */
@ManyToOne(cascade = CascadeType.MERGE)
@Required
public Customer customer;
@Required
public String description;
@Required
public boolean removal;
public String removalWay;
@ManyToOne(cascade = CascadeType.MERGE, optional=true,fetch = FetchType.LAZY)
public User personResponsibleForRemoval;
@DateTime(pattern = "YYYY-MM-DD")
public String removalDeadline;
@DateTime(pattern = "YYYY-MM-DD")
public String removalDate;
public void toDataBase() {
JPA.em().persist(this);
}
}
和用户实体:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Constraints.Required
public String email;
public String password;
@ManyToOne(cascade = CascadeType.PERSIST)
@Constraints.Required
public Customer customer;
@ManyToOne(cascade=CascadeType.MERGE)
public Department department;
@ManyToMany(cascade = CascadeType.PERSIST)
public List<Role> role;
@Constraints.Required
public boolean system;
@Constraints.Required
public boolean active;
@Constraints.Required
public boolean worker;
@Constraints.Required
public String date = Index.getDate(null);
}
如果这是一个新实例,您需要将CascadeType.PERSIST添加到cascade选项中。这根本不是一个实例。只有空值:this.user=null;当我把它放在那里的时候,它就起作用了。我不使用此实体添加用户。我只想有参考用户!如果这是唯一的关系实体,那么代码中还有其他错误。发布所有相关代码。对象引用未保存的临时实例-在刷新之前保存临时实例:models.InconsistencyRegistry.personResponsibleForRemoval此字段似乎不为null。我确定它为null原因,我已检查它:System.out.printlunsistencyRegistryFromForm.removalPersonResponsibleFor==null;wich返回true,并且我还手动向其分配null值:unconsistencyRegistryFromForm.removalPersonResponsibleFor=null。对我来说,游戏框架有些问题