I test the time cost for find(), obtain a linear complexity with the following codes:

int iBlock = 0x10000; for (int i = 1; i <= 3*iBlock; i++) { trans.begin(); Node o = new Node(); Node p = em.find(Node.class, i/3); if (null==p) System.out.printf("Node %d has no parent.%n", i); o.setParent( p ); em.persist(o); trans.commit(); if ((i & 0xFF)==0){ end = System.currentTimeMillis(); System.out.printf("%d @ %s %n",i, (end-start)/1000f); } }

The time cost of each 256 commits changed from 0.343 to 59.344 seconds, the graph attached shows a linear complexity, i.e. O(n). So what algorithm in find()? Can it improved to O(log(n)) complexity?

There's never been infinity. Cantor's diagonal proof is completely wrong.