25

当我调用刷新函数时,我从我的 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)
4

5 回答 5

16

来自以下文档EntityManager

IllegalArgumentException - 如果不是实体或实体不受管理

  1. 检查您的实体是否已映射(使用@Entity,或使用.xml配置)
  2. 您的实体必须是持久的 - 即由 entityManager 管理。因此,如果您的实体是分离的,merge()首先是它,然后refresh()是它。
于 2010-01-15T08:41:05.450 回答
15
public void saveProduct(Product product) {
    ...

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

    ...
}

以这种方式工作。managedProductEntity将被管理,因此可以从数据库中刷新。

于 2011-01-31T06:21:56.707 回答
9

如果product对象刚刚创建,则无法创建,refresh()因为数据库中没有包含对象原始值的行。您首先必须先到实体管理器,persist()然后product才是可能的。flush()refresh()

于 2010-01-16T10:32:13.793 回答
3

如果一个对象被分离,它也不能被刷新。想知道它是否可能是一个错误......只需看看 AbstractEntityManagerImpl 的第 730-733 行(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" );
        }
    ...
于 2011-07-26T18:44:32.480 回答
1

传递一个空实体将返回同样的错误。当我们第一次实现刷新例程时,我们的应用程序中遇到了这个问题,并且由于实体都是托管的,因此无法理解它。托管实体的空实例显然不算数!

于 2014-04-18T01:06:05.680 回答