У меня есть база данных PostgreSQL 8.4 с некоторыми таблицами и представлениями, которые по существу объединяются в некоторые из таблиц. Я использовал NetBeans 7.2 (как описано здесь) для создания служб на основе REST, полученных из этих представлений и таблиц, и развернул их на сервере Glassfish 3.1.2.2.
Существует еще один процесс, который асинхронно обновляет содержимое в некоторых таблицах, используемых для создания представлений. Я могу напрямую запросить представления и таблицы и увидеть, что эти изменения произошли правильно. Однако при использовании служб REST, значения не совпадают с значениями в базе данных. Я предполагаю, что это связано с тем, что JPA кэширует локальные копии содержимого базы данных на сервере Glassfish, а JPA необходимо обновить связанные объекты.
Я попытался добавить несколько методов в класс AbstractFacade NetBeans генерирует:
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
private String entityName;
private static boolean _refresh = true;
public static void refresh() { _refresh = true; }
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
this.entityName = entityClass.getSimpleName();
}
private void doRefresh() {
if (_refresh) {
EntityManager em = getEntityManager();
em.flush();
for (EntityType<?> entity : em.getMetamodel().getEntities()) {
if (entity.getName().contains(entityName)) {
try {
em.refresh(entity);
// log success
}
catch (IllegalArgumentException e) {
// log failure ... typically complains entity is not managed
}
}
}
_refresh = false;
}
}
...
}
Затем я вызываю doRefresh()
из каждого из методов find
, которые генерирует NetBeans. То, что обычно происходит, - это IllegalArgumentsException
, указывающее что-то вроде Can not refresh not managed object: [email protected]:MyView [ javaType: class org.my.rest.MyView descriptor: RelationalDescriptor(org.my.rest.MyView --> [DatabaseTable(my_view)]), mappings: 12].
Итак, я ищу несколько предложений о том, как правильно обновлять объекты, связанные с представлениями, так что это актуально.
ОБНОВЛЕНИЕ: Оказывается, мое понимание основной проблемы неверно. Это несколько связано с другим вопросом, который я опубликовал ранее, а именно, в представлении не было ни одного поля, которое могло бы использоваться как уникальный идентификатор. NetBeans требуется, чтобы я выбрал поле ID, поэтому я просто выбрал одну часть того, что должно было быть многочастным ключом. Это показало, что все записи с определенным полем идентификатора были идентичны, хотя в базе данных были записи с одинаковым идентификационным полем, но остальная часть была другой. JPA не идет дальше, чем смотреть на то, что я сказал, что это уникальный идентификатор, и просто вытащил первую найденную запись.
Я разрешил это, добавив уникальное поле идентификатора (никогда не смог заставить многопрофильный ключ работать правильно).