Hibernate 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

调用刷新函数时,我从EntityManager收到此错误

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
    配置)
  • 您的实体必须是持久的,即由entityManager管理。因此,如果您的实体已分离,
    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" );
            }
        ...