package entity.system; import op.tools.SYSTools; import javax.persistence.*; /** * Created by IntelliJ IDEA. * User: tloehr * Date: 20.12.11 * Time: 14:29 * To change this template use File | Settings | File Templates. */ public class UniqueTools { /** * Gibt eine eindeutige Nummer an den Aufrufer zurück. Die Nummer wird anhand der Datenbanktabelle UNIQUEID bestimmt. * Da führt das System über die vergebenen IDs buch. Können für alles mögliche benutzt werden wo eben globale, eindeutige Schlüssel * benöigt werden. Man kann auch einen prefix angeben. Dann führt die Methode in der Tabelle auch mehrere, getrennte Zähler. * <p/> * Der Standardzähler ist leer, also "". * * @return long UID */ public static Unique getNewUID(EntityManager em, String prefix) throws Exception { Query query = em.createQuery("SELECT u FROM Unique u WHERE u.prefix = :prefix"); query.setParameter("prefix", SYSTools.catchNull(prefix).trim()); Unique unique; try { unique = (Unique) query.getSingleResult(); } catch (NoResultException nre){ unique = null; } if (unique == null) { // für diesen prefix gibt es noch keinen Zähler. Es wird einer angelegt. unique = em.merge(new Unique(prefix)); } else { boolean done = false; while (!done) { try { em.lock(unique, LockModeType.OPTIMISTIC); unique.incUID(); done = true; } catch (OptimisticLockException ole){ done = false; em.refresh(unique); } } } return unique; } }