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

null エンティティを渡すと、これと同じエラーが返されます。アプリでこの問題が発生したのは、最初に更新ルーチンを実装したときで、エンティティがすべて管理されていたため意味がわかりませんでした。管理されたエンティティの null インスタンスは明らかにカウントされません!

于 2014-04-18T01:06:05.680 に答える