更改一个字段后,Hibernate Search Not Indexing

时间:2015-11-26 14:28:34

标签: hibernate hibernate-search

您好我正在尝试解决Hibernate Search索引经典Sql查询更改的列,如下所示:

 @Override
    public boolean updateColumn(K entityId, String columnName, String columnValue) {
        String entityName = daoType.getSimpleName();
        ClassMetadata employeeMeta = currentSession().getSessionFactory().getClassMetadata(daoType);
        String primaryKey = employeeMeta.getIdentifierPropertyName();
        String queryString = "update " + entityName + " set " + columnName + "='" + columnValue + "' where " + primaryKey + "=" + entityId;
        org.hibernate.Query query = currentSession().createQuery(queryString);

        boolean result = query.executeUpdate() > 0;
        return result;
    }

按以下方式调用上述方法:

belgeSatirService.updateColumn(1, "basvuruNo", "thgm");

更新“basvuruNo”列后,Hibernate不会自动更新basvuruNo列。本专栏的定义如下:

@Field(store = Store.YES)
@Column(name = "BasvuruNo", length = 30)//13/95088973/0735/000001
@Analyzer(definition = "whitespaceanalyzer")
private String basvuruNo;

1 个答案:

答案 0 :(得分:2)

Hibernate Search不支持拦截使用查询应用的更新更新。

我建议重写DAO模式以使用Hibernate友好模式:在域模型上使用实际对象和设置器。

您还可以从中获得其他一些好处,例如:

  • 可以启用二级缓存。
  • 受益于脏检查:避免不必要的数据库连接和操作。
  • 高性能状态处理,是否要启用字节码检测或类似工具。
  • Hibernate Envers,Hibernate Search和其他正确集成的工具。
  • 你还将在运行时节省大量内存:更好的性能。

这样的方法看起来像这样:

public void updateBasvuruNo(K entityId, Class<E> type, String newBasvuruNo) {
    E yourEntity = currentSession().load( type, entityId );
    yourEntity.setBasvuruNo( newBasvuruNo );
}

管理实体的状态根据需要刷新到数据库,仅在需要时由应用程序控制:通常由事务范围控制。 所以你可能根本不想使用这样的帮助器,它只是不必要的样板。