Проблема обновления EntityManager - PullRequest
20 голосов
/ 15 января 2010

Я получаю эту ошибку от моего EntityManager при вызове функции обновления.

public void saveProduct(Product product) {
    entityManager.refresh(product);
}

Я слышал, что это может быть ошибка в Spring / Hibernate, однако я не уверен, как обойти это.

Edit: ошибка

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)

Ответы [ 5 ]

15 голосов
/ 15 января 2010

Из документов EntityManager:

IllegalArgumentException - если не сущность или сущность не управляется

  1. Проверьте, отображается ли ваша сущность (с использованием @Entity или с конфигурацией .xml)
  2. Ваша сущность должна быть постоянная - то есть управляемая entityManager. Так что, если ваша сущность обособлена, сначала это merge(), а затем refresh().
11 голосов
/ 31 января 2011
public void saveProduct(Product product) {
    ...

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

    ...
}

Работает так. managedProductEntity будет управляемым , поэтому его можно обновить из базы данных.

7 голосов
/ 16 января 2010

Если объект product был только что создан, вы не можете refresh() его, потому что в базе данных нет строки с исходными значениями объекта. Сначала вы должны persist() product, а затем flush() диспетчер сущностей, после чего возможно refresh().

1 голос
/ 18 апреля 2014

Передача нулевого объекта возвращает ту же ошибку. У нас была эта проблема в нашем приложении, когда мы впервые реализовали подпрограммы обновления и не могли понять ее, поскольку все объекты были управляемыми. Нулевой экземпляр управляемого объекта, очевидно, не считается!

1 голос
/ 26 июля 2011

Если объект отсоединен, его также нельзя обновить. Интересно, может ли это быть ошибкой ... Просто взгляните на строки 730-733 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" );
        }
    ...
...