Hibernate EntityManager刷新问题
调用刷新函数时,我从EntityManager收到此错误Hibernate EntityManager刷新问题,hibernate,spring,orm,jpa,entitymanager,Hibernate,Spring,Orm,Jpa,Entitymanager,调用刷新函数时,我从EntityManager收到此错误 public void saveProduct(Product product) { entityManager.refresh(product); } 我听说这可能是Spring/Hibernate的一个bug,但是我不知道如何解决这个问题 编辑: 错误是 java.lang.IllegalArgumentException: Entity not managed org.hibernate.ejb.AbstractEntit
public void saveProduct(Product product) {
entityManager.refresh(product);
}
我听说这可能是Spring/Hibernate的一个bug,但是我不知道如何解决这个问题
编辑:
错误是
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)
从以下文件:
IllegalArgumentException-如果不是实体或未管理的实体
@entity
,或使用.xml
配置)merge()
it,然后refresh()
it如果刚刚创建了
产品
对象,则无法刷新()
它,因为数据库中没有包含该对象原始值的行。首先必须persist()
产品然后flush()
实体管理器,然后才能refresh()
public void saveProduct(Product product) {
...
Product managedProductEntity = entityManager.find(Product.class, product.getId());
entityManager.refresh(managedProductEntity);
...
}
就是这样managedProductEntity
将被管理,因此它可以从数据库中刷新。如果对象被分离,它也无法刷新。不知道这是否是一个错误。。。请看AbstractEntityManagerImpl(Hibernate 3.6.0.Final?)的第730-733行:
public void刷新(对象实体、LockModeType LockModeType、映射属性){
...
如果(!getSession().包含(实体)){
抛出新的IllegalArgumentException(“未管理的实体”);
}
...
传递一个空实体将返回相同的错误。当我们第一次实现刷新例程时,我们的应用程序中出现了这个问题,并且无法理解它,因为这些实体都是被管理的。被管理实体的空实例显然不算数!我编辑了我的代码来执行此操作:getEntityManager().refresh(getEntityManager().merge(product));我检查了@Entity是否已映射。但getEntityManager()仍然存在相同的问题每次打开一个新的EM?如果是这样,您将在一个hibernate会话中合并一个实体,并在另一个会话中刷新它。@Luka Klepec如何检查我的EntityManager是否每次都打开一个新EM?我正在使用持久性管理器
public void refresh(Object entity, LockModeType lockModeType, Map<String, Object> properties) {
...
if ( !getSession().contains( entity ) ) {
throw new IllegalArgumentException( "Entity not managed" );
}
...