2016-03-15 5 views
0

Привет Я пытаюсь принести Java объект через JPA getSingleResult но его бросать исключение, я не мог найти в API specsJPA getSingleResult - EntityNotFound Исключение

Способ по:

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)); 

класс Tag:

@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; 

В соответствии с API спецификации для getSingleResult следующие исключения должны быть брошены только:

  • NoResultException - если нет результата
  • NonUniqueResultException - если более чем один результат
  • IllegalStateException - если вызывается запрос Java Persistence язык ОБНОВЛЕНИЕ или 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) на контроллер s.ProductController.updateProductInfo (ProductController.java:282) на маршрутизатор.Маршруты $$ anonfun $ routes $ 1 $$ anonfun $ applyOrElse $ 4 $$ anonfun $ apply $ 4.apply (Routes.scala: 1584) at router.Routes $$ anonfun $ routes $ 1 $$ anonfun $ applyOrElse $ 4 $$ anonfun $ применять $ 4.Apply (Routes.scala: 1584) в play.core.routing.HandlerInvokerFactory $$ Анон $ 4.resultCall (HandlerInvoker.scala: 136) в play.core.routing.HandlerInvokerFactory $ JavaActionInvokerFactory $$ Анон $ 14 $$ anon $ 3 $$ anon $ 1.invocation (HandlerInvoker.scala: 127) at play.core.j.JavaAction $$ anon $ 1.call (JavaAction.scala: 70) в play.http.DefaultHttpRequestHandler $ 1.call (DefaultHttpRequestHandler.java:20) на перехватчиках.ПродукцияAction.call (ProductAction.java:65) на play.db.jpa.TransactionalAction.lambda $ call $ 5 (TransactionalActio n.java:19) в play.db.jpa.TransactionalAction $$ Lambda $ 43/469822182.apply (Неизвестно источник) в play.db.jpa.DefaultJPAApi.withTransaction (DefaultJPAApi.java:136) в игры. db.jpa.JPA.withTransaction (JPA.java:159) в play.db.jpa.TransactionalAction.call (TransactionalAction.java:16) в play.core.j.JavaAction $$ anonfun $ 7.apply (JavaAction. Скала: 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) at play.core.j.HttpExecutionContext $$ a не $ 2.run (HttpExecutionContext.scala: 40) на play.api.libs.iteratee.Execution $ батут $ .Execute (Execution.scala: 70) на play.core.j.HttpExecutionContext.execute (HttpExecutionContext. scala: 32) at 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) at play.api .mvc.Action $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 4 $$ anonfun $ apply $ 5.apply (Action.scala: 105) at play.utils.Threads $ .withContextClassLoader (Threads.scala: 21) на play.api.mvc.Action $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 4.apply (Action.scala: 104) at play.api.mvc.Action $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 4.apply (Action.scala: 103) at scala.Option.map (Option.scala: 145) at play.api.mvc.Action $$ anonfun $ применить $ 1.apply (Action.scala: 103) в play.api.mvc.Action $$ anonfun $ применить $ 1.apply (Action.scala: 96) в play.api.libs.iteratee.Iteratee $$ anonfun $ mapM $ 1.apply (Iteratee.scala: 524) at play.api.libs.iteratee.Iteratee $$ anonfun $ mapM $ 1.apply (Iteratee.scala: 524) at 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 $ применять $ 14.apply (Iteratee.scala: 537) на play.api .libs.iteratee.Iteratee $$ anonfun $ flatMap $ 1 $$ anonfun $ apply $ 14.apply (Iteratee.scala: 537) at 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) at 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, но я не могу найти проблему в этом случае.

Любая помощь на это оценивается.

+0

Как вы создаете объект 'Query', который вы передаете' getSingleResultOrNull (...) '. Я сомневаюсь, что вы можете использовать 'session', который уже имеет некоторые ожидающие обновления. Можете ли вы создать запрос из нового сеанса, используя 'openSession (...)' метод 'SessionFactory' и попробуйте. –

ответ

0

Я считаю, что ваша проблема вызвана на каком-то этапе раньше. Глядя на вашу трассировке стеки, есть эта линия как раз перед вызовом метода вы показываете:

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

Может быть, вы обновляете состояние некоторого объекта внутри updateProductInfo и Hibernate является промывкой сеанса только при вызове getSingleResultOrNull метод.

Здесь есть какая-то похожая ситуация, что вы также можете взглянуть на: Deleted entity passed to persist exception

+0

Привет @ bruno.zambiazi, спасибо за ваши данные. У меня нет каскадирования отношений, поэтому в идеале, когда я удаляю productTag, он должен оставить мой продукт и тег классифицированным нетронутым. Обновление этого кода. Также строка, на которую вы ссылаетесь, просто вызывает метод, который я здесь показал. И я удаляю несколько объектов тегов Product в updateProductInfo перед этим вызовом метода, ничего больше. Посмотрите, помогает ли дополнительное определение класса в вопросе. – user1242321

0

Это то, что происходит, когда я запрос на объект, который существует, но который отсутствует в базе данных:

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