如何将@FieldBridge实现到@EmbeddedId字段

时间:2017-09-12 19:08:59

标签: hibernate-search

当存在@EmbeddedId字段时,应实现自定义字段桥。 有一个功能开放https://hibernate.atlassian.net/browse/HSEARCH-1879。但它还没有准备好。

在这种情况下,正确实施的界面是 TwoWayFieldBridge

以下是我对包含5个字段的复合ID的实现。

public class ChavePrimariaAcompanhamentoBridge implements TwoWayFieldBridge {

    @Override
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {

        AcompanhamentoPK chavePrimaria = (AcompanhamentoPK) value;

        Integer ano = chavePrimaria.getAno();
        Integer mes = chavePrimaria.getMes();
        Long codigoCredenciada = chavePrimaria.getCredenciada().getCodigo();
        Long codigoPosto = chavePrimaria.getPostoAtendimento().getCodigo();
        Integer numeroSequencial = chavePrimaria.getNumeroSequencial();

        luceneOptions.addNumericFieldToDocument("mes", mes, document);
        luceneOptions.addNumericFieldToDocument("ano", ano, document);
        luceneOptions.addNumericFieldToDocument("credenciada.codigo", codigoCredenciada, document);
        luceneOptions.addNumericFieldToDocument("postoAtendimento.codigo", codigoPosto, document);
        luceneOptions.addNumericFieldToDocument("numeroSequencial", numeroSequencial, document);
    }

    @Override
    public Object get(String name, Document document) {

        AcompanhamentoPK chavePrimaria = new AcompanhamentoPK();
        chavePrimaria.setMes(Integer.valueOf(document.get("mes")));
        chavePrimaria.setAno(Integer.valueOf(document.get("ano")));
        chavePrimaria.setCredenciada(new Credenciada(Long.valueOf(document.get("credenciada.codigo"))));
        chavePrimaria.setPostoAtendimento(new CadastroPostoAtendimento(Long.valueOf(document.get("postoAtendimento.codigo"))));
        chavePrimaria.setNumeroSequencial(Integer.valueOf(document.get("numeroSequencial")));

        return chavePrimaria;
    }

    @Override
    public String objectToString(Object value) {
        AcompanhamentoPK chavePrimaria = (AcompanhamentoPK) value;

        return chavePrimaria.toString();
    }

}

1 - 还有另一种最佳方法吗?

2 - 此实施中是否有任何错误(关于概念)?

3 - objectToString方法用于什么?这很重要吗?

我正在提出这个问题,因为我没有找到任何关于它的文档,所以我不确定。

1 个答案:

答案 0 :(得分:4)

  

在这种情况下,正确实现的接口是TwoWayFieldBridge?

是:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_two_way_bridge

  

1 - 还有另一种最好的方法吗?

不是我知道的。

  

2 - 此实现中是否有任何错误(关于概念)?

  • 你不应该在这里使用Integer.valueOf。只需在Field.numericValue()的结果上调用document.get,然后将结果转换为Integer
  • 您还应该在set()方法中存储ID的唯一字符串表示形式:

    luceneOptions.addFieldToDocument( name, objectToString( id ), document );
    
  

3 - 用于?

的objectToString方法是什么

Hibernate Search将主要使用此方法的结果来构建查询,例如,当它必须检索应删除的文档时,或者当您明确查询ID字段时。

  

这很重要吗?

除非你正确实施,否则什么都不会起作用,即除非你确定:

  • 它为两个不同的复合ID返回两个不同的值
  • 它始终为给定的复合ID返回相同的值