当我调用刷新函数时,我从我的EntityManager中收到此错误。
public void saveProduct(Product product) {
entityManager.refresh(product);
}
我听说这可能是Spring / Hibernate的一个错误,但是我不知道如何解决这个问题。
编辑: 错误是
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)
答案 0 :(得分:14)
来自EntityManager
的文档:
IllegalArgumentException - 如果没有管理实体或实体
@Entity
或.xml
配置)merge()
,然后再refresh()
。答案 1 :(得分:11)
public void saveProduct(Product product) {
...
Product managedProductEntity = entityManager.find(Product.class, product.getId());
entityManager.refresh(managedProductEntity);
...
}
以这种方式工作。 managedProductEntity
将托管,因此可以从数据库刷新。
答案 2 :(得分:7)
如果刚刚创建了product
对象,则不能refresh()
它,因为数据库中没有包含对象原始值的行。您首先必须persist()
product
然后flush()
实体管理员,之后可以refresh()
。
答案 3 :(得分:1)
如果对象已分离,则也无法刷新。不知道它是不是一个bug ...只需看看AbstractEntityManagerImpl(Hibernate 3.6.0.Final?)的第730-733行:
public void refresh(Object entity, LockModeType lockModeType, Map<String, Object> properties) {
...
if ( !getSession().contains( entity ) ) {
throw new IllegalArgumentException( "Entity not managed" );
}
...
答案 4 :(得分:1)
传递null实体将返回相同的错误。当我们第一次实现刷新例程时,我们在应用程序中遇到了这个问题,并且因为实体都是管理的,所以无法理解它。托管实体的空实例显然不算数!