web-dev-qa-db-fra.com

EntityManager Rafraîchir le problème

Je reçois cette erreur de mon entitémanager lorsque j'appelle la fonction d'actualisation.

public void saveProduct(Product product) {
    entityManager.refresh(product);
}

J'ai entendu dire que cela pourrait être un bug avec le printemps/hibernate, mais je ne suis pas sûr de savoir comment se déplacer.

EDIT: L'erreur est

Java.lang.IllegalArgumentException: Entity not managed
org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.Java:268)
Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
Java.lang.reflect.Method.invoke(Method.Java:597)
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.Java:358)
$Proxy17.refresh(Unknown Source)
Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
Java.lang.reflect.Method.invoke(Method.Java:597)
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.Java:198)
$Proxy11.refresh(Unknown Source)
springapp.repository.JdbcProductDao.saveProduct(JdbcProductDao.Java:66)
springapp.service.SimpleProductManager.increasePrice(SimpleProductManager.Java:28)
springapp.web.PriceIncreaseFormController.onSubmit(PriceIncreaseFormController.Java:39)
Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
Java.lang.reflect.Method.invoke(Method.Java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.Java:421)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.Java:136)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.Java:326)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.Java:313)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:875)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:807)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:571)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.Java:511)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
23
Albinoswordfish

Des documents de EntityManager :

IllegalargumentException - sinon une entité ou une entité n'est pas gérée

  1. Vérifiez si votre entité est mappée (en utilisant @Entity Ou avec .xml Configuration)
  2. Votre entité doit être persistante - I.e. Géré par l'entitémanager. Donc, si votre entité est détachée, merge() il en premier, puis refresh() It.
16
Bozho
public void saveProduct(Product product) {
    ...

    Product managedProductEntity = entityManager.find(Product.class, product.getId());
    entityManager.refresh(managedProductEntity);

    ...
}

Fonctionne de cette façon. managedProductEntity sera géré, et donc il peut donc être actualisé de la base de données.

14
Daniel Szalay

Si l'objet product vient d'être créé, vous ne pouvez pas refresh() It, car il n'y a pas de ligne dans la base de données avec les valeurs d'origine de l'objet. Vous devez d'abord avoir à persist() le product, puis flush() L'entitémanager, après cela a refresh() est possible.

8
Danny Groenewegen

Si un objet est détaché, il ne peut pas être rafraîchi non plus. Je me demande s'il s'agissait d'un bug ... Jetez un coup d'œil aux lignes 730-733 de AbstractentityManagerimpl (Hibernate 3.6.0.final?):

    public void refresh(Object entity, LockModeType lockModeType, Map<String, Object> properties) {
    ...
        if ( !getSession().contains( entity ) ) {
            throw new IllegalArgumentException( "Entity not managed" );
        }
    ...
2
Nick G.

Le passage d'une entité nulte retournera cette même erreur. Nous avons eu ce problème dans notre application lorsque nous avons mis en œuvre d'abord des routines de rafraîchir et que nous ne pouvions pas le faire, car les entités étaient toutes gérées. Une instance nulle d'une entité gérée ne compte évidemment pas!

1
user2125247