JPA没有指定这样的功能,但你可以使用EclipseLink内部组件来实现,例如:
L1(事务缓存,持久化上下文)
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
...
JpaEntityManager jem = em.unwrap(JpaEntityManager.class);
UnitOfWorkImpl ouw = jem.unwrap(UnitOfWorkImpl.class);
...
long count = countCachedEntitiesL1(clazz);
和相应的方法:
// Java 7
public long countCachedEntitiesL1(Class clazz) {
long count = 0;
for (Map.Entry entity : ouw.getCloneMapping().entrySet()) {
if (entity.getKey().getClass().equals(clazz)) {
count++;
}
}
return count;
}
// Java 8
public long countCachedEntitiesL1(Class clazz) {
return ouw.getCloneMapping().keySet().stream()
.filter(entity -> entity.getClass().equals(clazz))
.count();
}
L2(共享缓存)
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
...
JpaEntityManager jem = em.unwrap(JpaEntityManager.class);
ServerSession ss = jem.unwrap(ServerSession.class);
IdentityMapAccessor ima = (IdentityMapAccessor) ss.getIdentityMapAccessor();
...
int count = countCachedEntitiesL2(clazz);
和相应的方法:
public int countCachedEntitiesL2(Class clazz) {
return ima.getIdentityMap(clazz).getSize();
}