更改一个字段后 Hibernate 搜索不编制索引

Hibernate Search Not Indexing after change one field

您好,我正在尝试解决 Hibernate 搜索以索引由经典 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;

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 );
}

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