【问题标题】:JPA getSingleResult - EntityNotfound ExceptionJPA getSingleResult - EntityNotfound 异常
【发布时间】: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。您可以使用SessionFactoryopenSession(...) 方法从新会话创建查询并尝试..

标签: java hibernate jpa


【解决方案1】:

我相信您的问题是在之前的某个步骤中引起的。查看您的堆栈跟踪,在调用您显示的方法之前有这一行:

controllers.ProductController.updateProductInfo(ProductController.java:282)

也许您正在更新 updateProductInfo 中的某个对象的状态,而 Hibernate 正在刷新会话,就在您调用 getSingleResultOrNull 方法时。

这里有一些类似的情况你也可以看看:Deleted entity passed to persist exception

【讨论】:

  • 嗨@bruno.zambiazi,感谢您的意见。我没有任何级联关系,因此理想情况下,当我删除 productTag 时,它应该保持我的产品和标签类别不变。为此更新有问题的代码。此外,您所指的行只是调用我在此处显示的方法。在此方法调用之前,我正在删除 updateProductInfo 中的一些产品标签实体,仅此而已。请查看问题中的附加类定义是否有帮助。
【解决方案2】:

当我查询一个存在但不在数据库中的实体时会发生这种情况:

javax.servlet.ServletException: javax.ejb.EJBException: javax.persistence.NoResultException: No entity found for query

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2011-01-01
    • 2012-01-19
    • 2018-08-07
    • 1970-01-01
    • 2018-07-03
    • 2020-01-30
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多