/** * parsing record to extract indexed fields * * @param isNew record has never been parsed * @param record record to parse */ private void indexRecord(boolean isNew, Record record) { for (Field field : mc.getIndexingField(record.getClass())) { try { // indexes can be shared by providing common key, or default key using field path is used String key = field.getAnnotation(FieldIndexing.class).value(); String name = field.getName(); if (key.length() == 0) { key = record.getClass().getName() + "." + name; } // reading field value to add to index list boolean status = field.isAccessible(); field.setAccessible(true); Object fieldValue = field.get(record); field.setAccessible(status); // database access EntityManager em = mc.getTransactionEntityManager(); RecordIndexPK pk = new RecordIndexPK(key, record.getId(), name); // forcing indexe deletion to preserve record batch save (npreveting select for each save) // Note : make sure the ModelController provides an entity manager with // setShouldPerformDeletesFirst(true) if (!isNew) { em.remove(em.getReference(RecordIndex.class, pk)); } // mapping the index to the database Comparable converted = pm.getConverted(fieldValue); if (converted != null) { RecordIndex ri = new RecordIndex(pk); switch (pm.getType(field.getType())) { case DATE: ri.setDate((Date) converted); break; case STRING: ri.setValue((String) converted); break; case NUMERIC: ri.setNumeric((BigDecimal) converted); break; } // saving em.persist(ri); } } catch (IllegalArgumentException | IllegalAccessException ex) { // convet to runtime exception throw new RuntimeException(ex); } } }