【发布时间】:2016-03-15 23:19:37
【问题描述】:
您好,我正在尝试通过 JPA getSingleResult 获取 java 实体,但它引发了我在 API specs 中找不到的异常
方法:
public static Object getSingleResultOrNull(Query q){
try{
return q.getSingleResult();
}catch(NoResultException| EntityNotFoundException enfex){
System.out.println(enfex.getMessage());
enfex.printStackTrace();
return null;
}catch(NonUniqueResultException ex){
ex.printStackTrace();
throw ex;
}
}
调用代码:
tagName = tagName.trim().toLowerCase();
Tags tag = (Tags) getSingleResultOrNull(namedQuery("Tags.findByName")
.setParameter("name", tagName));
标签类:
@Entity @Table(name = "tags") @XmlRootElement @NamedQueries({
@NamedQuery(name = "Tags.findByName", query = "SELECT t FROM Tags t WHERE t.name = :name")})
public class Tags implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "name")
private String name;
编辑: 添加产品标签。类
public class ProductTags implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@JsonIgnore
@Column(name = "created")
@Temporal(TemporalType.TIMESTAMP)
private Date created;
@JsonIgnore
@Column(name = "last_updated")
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated;
@JsonIgnore
@Column(name = "last_updated_by")
private String lastUpdatedBy;
@JsonIgnore
@JoinColumn(name = "prod_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Product prod;
@JoinColumn(name = "tag_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Tags tag;
根据 getSingleResult 的 API 规范,应该只抛出以下异常:
-
NoResultException- 如果没有结果 -
NonUniqueResultException- 如果有多个结果 -
IllegalStateException- 如果调用 Java 持久性查询 语言 UPDATE 或 DELETE 语句 -
QueryTimeoutException- 如果 查询执行超过了查询超时值设置,只有 语句回滚 -
TransactionRequiredException- 如果是锁 模式已设置,没有交易 -
PessimisticLockException- 如果悲观锁定失败并且 事务回滚 -
LockTimeoutException- 如果悲观 锁定失败,只有语句回滚 -
PersistenceException- 如果查询执行超过查询 设置超时值并回滚事务
但是,我得到一个奇怪的 javax.persistence.EntityNotFoundException 异常:已删除的实体传递给持久化:[models.ProductTags#]
对于一个完全不相关的实体(不完全是因为 ProductTags 具有 Tags 对象的外键,但在保存 Tags 对象的上下文中,我看不到任何关系。)不相关的实体。
传递给持久化的已删除实体:[models.ProductTags#] javax.persistence.EntityNotFoundException:已删除的实体传递给 坚持:[models.ProductTags#] 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1369) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315) 在 org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:307) 在 controllers.PowerController.getSingleResultOrNull(PowerController.java:68) 在 控制器.ProductController.updateProductInfo(ProductController.java:282) 在 router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$4$$anonfun$apply$4.apply(Routes.scala:1584) 在 router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$4$$anonfun$apply$4.apply(Routes.scala:1584) 在 play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136) 在 play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:127) 在 play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70) 在 play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20) 在拦截器.ProductAction.call(ProductAction.java:65) 在 play.db.jpa.TransactionalAction.lambda$call$5(TransactionalAction.java:19) 在 play.db.jpa.TransactionalAction$$Lambda$43/469822182.apply(未知 来源)在 play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:136) 在 play.db.jpa.JPA.withTransaction(JPA.java:159) 在 play.db.jpa.TransactionalAction.call(TransactionalAction.java:16) 在 play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) 在 play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) 在 scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 在 scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 在 play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) 在 play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) 在 play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) 在 scala.concurrent.impl.Future$.apply(Future.scala:31) 在 scala.concurrent.Future$.apply(Future.scala:485) 在 play.core.j.JavaAction.apply(JavaAction.scala:94) 在 play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) 在 play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) 在 play.utils.Threads$.withContextClassLoader(Threads.scala:21) 在 play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:104) 在 play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:103) 在 scala.Option.map(Option.scala:145) 在 play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:103) 在 play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96) at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) 在 play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) 在 play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) 在 play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) 在 play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) 在 play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) 在 scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 在 scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 在 akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) 在 akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) 在 scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 在 scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 在 scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 在 scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
我知道编写 getSingleResultOrNull 方法的另一种方法,但在这种情况下我无法找到问题所在。
对此的任何帮助表示赞赏。
【问题讨论】:
-
你是如何创建你传递给
getSingleResultOrNull(...)方法的Query对象。我怀疑您可能正在使用已经有一些待处理更新的session。您可以使用SessionFactory的openSession(...)方法从新会话创建查询并尝试..