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)
Des documents de EntityManager
:
IllegalargumentException - sinon une entité ou une entité n'est pas gérée
@Entity
Ou avec .xml
Configuration)merge()
il en premier, puis refresh()
It.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.
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.
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" );
}
...
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!