2016-03-03 2 views
0

Я использую Datanucleus для выполнения CRUD. Я удаляю объект, а затем выполняю именованный запрос, почему уже удаленный объект все еще входит в список результатов?Datanucleus JPA с именем query вернуть удаленную сущность

Во-первых, удалить объект:

MyEntity e = manager.find(MyEntity.class, id); 
manager.remove(e); 

Затем запрос:

@NamedQueries({ 
     @NamedQuery(name = MyEntity.FIND_ALL, query = "SELECT a FROM MyEntity a ORDER BY a.updated DESC") 
}) 
public static final String FIND_ALL = "MyEntity.findAll"; 
TypedQuery<MyEntity> query = manager.createNamedQuery(FIND_ALL, MyEntity.class); 
return query.getResultList(); 

Настройка datanucleus.Optimistic persistence.xml:

<property name="datanucleus.Optimistic" value="true" /> 

Названный запрос будет неожиданно вернуть список результатов, в которых есть удаленные объекты.

Однако, если значение datanucleus.Optimistic=false, то результат будет правильным. Почему datanucleus.Optimistic=true не работает?

Более подробно об этом случае:

Ниже CRUD связанные журнала:

1. Журнал операции сохранения:

DEBUG: DataNucleus.Transaction - Transaction begun for ExecutionContext [email protected] (optimistic=true) 
INFO : org.springframework.test.context.transaction.TransactionalTestExecutionListener - Began transaction (1): transaction manager [[email protected]]; rollback [true] 
DEBUG: DataNucleus.Persistence - Making object persistent : "[email protected]" 
DEBUG: DataNucleus.Cache - Object with id "com.demo.MyEntity:07cad778-d1c3-4834-ace7-ac2e4ecacc24" not found in Level 1 cache [cache size = 0] 
DEBUG: DataNucleus.Cache - Object with id "com.demo.MyEntity:07cad778-d1c3-4834-ace7-ac2e4ecacc24" not found in Level 2 cache 
DEBUG: DataNucleus.Persistence - Managing Persistence of Class : com.demo.MyEntity [Table : (none), InheritanceStrategy : superclass-table] 
DEBUG: DataNucleus.Cache - Object "[email protected]" (id="com.demo.MyEntity:07cad778-d1c3-4834-ace7-ac2e4ecacc24") added to Level 1 cache (loadedFlags="[YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN]") 
DEBUG: DataNucleus.Lifecycle - Object "[email protected]" (id="com.demo.MyEntity:07cad778-d1c3-4834-ace7-ac2e4ecacc24") has a lifecycle change : "HOLLOW"->"P_NONTRANS" 
DEBUG: DataNucleus.Persistence - Fetching object "[email protected]" (id=07cad778-d1c3-4834-ace7-ac2e4ecacc24) fields [entityId,extensions,objectType,openSocial,published,updated,url,actor,appId,bcc,bto,cc,content,context,dc,endTime,generator,geojson,groupId,icon,inReplyTo,ld,links,location,mood,object,odata,opengraph,priority,provider,rating,result,schema_org,source,startTime,tags,target,title,to,userId,verb] 
DEBUG: DataNucleus.Datastore.Retrieve - Object "[email protected]" (id="07cad778-d1c3-4834-ace7-ac2e4ecacc24") being retrieved from HBase 
DEBUG: org.apache.hadoop.hbase.zookeeper.ZKUtil - hconnection opening connection to ZooKeeper with ensemble (master.hbase.com:2181) 

.... 
DEBUG: org.apache.hadoop.hbase.client.MetaScanner - Scanning .META. starting at row=MyEntity,,00000000000000 for max=10 rows using org.apache.h[email protected]25c7f5b0 
... 
DEBUG: DataNucleus.Cache - Object with id="com.demo.MyEntity:07cad778-d1c3-4834-ace7-ac2e4ecacc24" being removed from Level 1 cache [current cache size = 1] 
DEBUG: DataNucleus.ValueGeneration - Creating ValueGenerator instance of "org.datanucleus.store.valuegenerator.UUIDGenerator" for "uuid" 
DEBUG: DataNucleus.ValueGeneration - Reserved a block of 1 values 
DEBUG: DataNucleus.ValueGeneration - Generated value for field "com.demo.BaseEntity.entityId" using strategy="custom" (Generator="org.datanucleus.store.valuegenerator.UUIDGenerator") : value=4aa3c4a8-b450-473e-aeba-943dc6ef30ce 
DEBUG: DataNucleus.Cache - Object "[email protected]" (id="com.demo.MyEntity:4aa3c4a8-b450-473e-aeba-943dc6ef30ce") added to Level 1 cache (loadedFlags="[YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY]") 
DEBUG: DataNucleus.Transaction - Object "[email protected]" (id="4aa3c4a8-b450-473e-aeba-943dc6ef30ce") enlisted in transactional cache 
DEBUG: DataNucleus.Persistence - Object "[email protected]" has been marked for persistence but its actual persistence to the datastore will be delayed due to use of optimistic transactions or "datanucleus.flush.mode" setting 

2. Вход операции DELETE:

DEBUG: DataNucleus.Cache - Object "[email protected]" (id="com.demo.MyEntity:4aa3c4a8-b450-473e-aeba-943dc6ef30ce") taken from Level 1 cache (loadedFlags="[YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY]") [cache size = 1] 
DEBUG: DataNucleus.Persistence - Deleting object from persistence : "[email protected]" 
DEBUG: DataNucleus.Lifecycle - Object "[email protected]" (id="com.demo.MyEntity:4aa3c4a8-b450-473e-aeba-943dc6ef30ce") has a lifecycle change : "P_NEW"->"P_NEW_DELETED" 

3. Журнал названной операции QUERY:

DEBUG: DataNucleus.Cache - Query Cache of type "org.datanucleus.query.cache.SoftQueryCompilationCache" initialised 
DEBUG: DataNucleus.Cache - Query Cache of type "org.datanucleus.store.query.cache.SoftQueryDatastoreCompilationCache" initialised 
DEBUG: DataNucleus.Cache - Query Cache of type "org.datanucleus.store.query.cache.SoftQueryResultsCache" initialised 
DEBUG: DataNucleus.Query - JPQL Single-String with "SELECT a FROM MyEntity a ORDER BY a.updated DESC" 
DEBUG: DataNucleus.Persistence - ExecutionContext.internalFlush() process started using optimised flush - 0 to delete, 1 to insert and 0 to update 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #7 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #7 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: exists 0 
DEBUG: DataNucleus.Datastore.Persist - Object "[email protected]" being inserted into HBase with all reachable objects 
DEBUG: DataNucleus.Datastore.Native - Object "[email protected]" PUT into HBase table "MyEntity" as {"totalColumns":3,"families":{"MyEntity":[{"timestamp":9223372036854775807,"qualifier":"DTYPE","vlen":8},{"timestamp":9223372036854775807,"qualifier":"userId","vlen":5},{"timestamp":9223372036854775807,"qualifier":"entityId","vlen":36}]},"row":"4aa3c4a8-b450-473e-aeba-943dc6ef30ce"} 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #8 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #8 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: multi 2 
DEBUG: DataNucleus.Datastore.Persist - Execution Time = 123 ms 
DEBUG: DataNucleus.Persistence - ExecutionContext.internalFlush() process finished 
DEBUG: DataNucleus.Query - JPQL Query : Compiling "SELECT a FROM MyEntity a ORDER BY a.updated DESC" 
DEBUG: DataNucleus.Query - JPQL Query : Compile Time = 13 ms 
DEBUG: DataNucleus.Query - QueryCompilation: 
    [from:ClassExpression(alias=a)] 
    [ordering:OrderExpression{PrimaryExpression{a.updated} descending}] 
    [symbols: a type=com.demo.MyEntity] 
DEBUG: DataNucleus.Query - JPQL Query : Compiling "SELECT a FROM MyEntity a ORDER BY a.updated DESC" for datastore 
DEBUG: DataNucleus.Query - JPQL Query : Compile Time for datastore = 2 ms 
DEBUG: DataNucleus.Query - JPQL Query : Executing "SELECT a FROM MyEntity a ORDER BY a.updated DESC" ... 
DEBUG: DataNucleus.Datastore.Native - Retrieving objects for candidate=com.demo.MyEntity and subclasses 
DEBUG: org.apache.hadoop.hbase.client.ClientScanner - Creating scanner over MyEntity starting at key '' 
DEBUG: org.apache.hadoop.hbase.client.ClientScanner - Advancing internal scanner to startKey at '' 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #9 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #9 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: openScanner 1 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #10 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #10 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: next 0 
DEBUG: DataNucleus.Cache - Object "[email protected]" (id="com.demo.MyEntity:4aa3c4a8-b450-473e-aeba-943dc6ef30ce") taken from Level 1 cache (loadedFlags="[YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY]") [cache size = 1] 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #11 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #11 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: next 0 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 sending #12 
DEBUG: org.apache.hadoop.ipc.HBaseClient - IPC Client (47) connection to namenode.hbase.com/192.168.1.99:60020 from user1 got value #12 
DEBUG: org.apache.hadoop.ipc.RPCEngine - Call: close 1 
DEBUG: org.apache.hadoop.hbase.client.ClientScanner - Finished with scanning at {NAME => 'MyEntity,,1457106265917.c6437b9afd33cd225c33e0ed52ff50d4.', STARTKEY => '', ENDKEY => '', ENCODED => c6437b9afd33cd225c33e0ed52ff50d4,} 
DEBUG: DataNucleus.Query - JPQL Query : Processing the "ordering" clause using in-memory evaluation (clause = "[OrderExpression{PrimaryExpression{a.updated} descending}]") 
DEBUG: DataNucleus.Query - JPQL Query : Processing the "resultClass" clause using in-memory evaluation (clause = "com.demo.MyEntity") 
DEBUG: DataNucleus.Query - JPQL Query : Execution Time = 14 ms 

Почему следующие журналы (PUT сущностей с жизненным циклом "P_NEW_DELETED" в хранилище данных) появляются во время операции QUERY? И как избежать такого поведения?

DEBUG: DataNucleus.Datastore.Persist - Object "[email protected]" being inserted into HBase with all reachable objects 
DEBUG: DataNucleus.Datastore.Native - Object "[email protected]" PUT into HBase table "MyEntity" as {"totalColumns":3,"families":{"MyEntity":[{"timestamp":9223372036854775807,"qualifier":"DTYPE","vlen":8},{"timestamp":9223372036854775807,"qualifier":"userId","vlen":5},{"timestamp":9223372036854775807,"qualifier":"entityId","vlen":36}]},"row":"4aa3c4a8-b450-473e-aeba-943dc6ef30ce"} 
+1

Есть вопрос? –

+0

Создание запроса «NAMED» означает, что вы где-то задали именованный запрос в файле. И у вас есть? в каком случае это где? –

+0

Да, и я обновил свой пост. Благодаря! – Michael

ответ

1

Вы включили оптимистичные транзакции, поэтому все операции записи данных выполняются только при фиксации. Вы выполнили запрос до того, как это произошло (и не установили режим очистки для запроса), поэтому ваше удаление не находится в хранилище данных при выполнении запроса.

Вызов

em.flush() 

перед выполнением запроса, или установить

query.setFlushMode(FlushModeType.AUTO); 
Смежные вопросы