我有一个PostgreSQL 8.4数据库,其中包含一些表和视图,这些表和视图本质上是一些表上的连接.我使用NetBeans 7.2(如here所述)创建从这些视图和表派生的基于REST的服务,并将其部署到Glassfish 3.1.2.2服务器上.
还有另一个过程,它异步更新用于构建视图的某些表中的内容.我可以直接查询视图和表,并查看这些更改是否正确发生.但是,当从基于REST的服务中提取时,这些值与数据库中的值不同.假设Glassfish的本地内容与JPA服务器上的JPA实体相关联,则需要刷新.
我try 过向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;
}
}
...
}
然后我从NetBeans生成的find
个方法中调用doRefresh()
个.通常情况下,IllegalArgumentsException
被抛出,表示类似Can not refresh not managed object: EntityTypeImpl@28524907:MyView [ javaType: class org.my.rest.MyView descriptor: RelationalDescriptor(org.my.rest.MyView --> [DatabaseTable(my_view)]), mappings: 12].
的内容
因此,我正在寻找一些关于如何正确刷新与视图关联的实体的建议,以便它是最新的.
更新:结果表明我对潜在问题的理解不正确.它在某种程度上与another question I posted earlier有关,即视图没有可以用作唯一标识符的单个字段.NetBeans要求我 Select 一个ID字段,所以我只 Select 了一个应该是多部分密钥的部分.这表明,具有特定ID字段的所有记录都是相同的,尽管数据库中有具有相同ID字段的记录,但其余部分不同.JPA只是查看了我告诉它的唯一标识符,然后简单地提取了它找到的第一条记录.
我通过添加一个唯一标识符字段解决了这个问题(从未能够让多部分密钥正常工作).