Привет Я пытаюсь принести 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, но я не могу найти проблему в этом случае.
Любая помощь на это оценивается.
Как вы создаете объект 'Query', который вы передаете' getSingleResultOrNull (...) '. Я сомневаюсь, что вы можете использовать 'session', который уже имеет некоторые ожидающие обновления. Можете ли вы создать запрос из нового сеанса, используя 'openSession (...)' метод 'SessionFactory' и попробуйте. –