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

How to implement a @FieldBridge to an @EmbeddedId field

当有@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 方法的用途是什么?重要吗?

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

编辑:在 Hibernate Search 6+ 中,为了映射 @EmbeddedId,您应该使用自定义 IdentifierBridgehttps://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#mapper-orm-bridge-identifierbridge


Hibernate Search 5 的原始答案:

In this case, the interface correct to implement is TwoWayFieldBridge?

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

1 - Is there another best way to make it?

据我所知没有。

2 - Is there any error(about concepts) in this implementation?

是的。

  • 你不应该在这里使用 Integer.valueOf。只需对 document.get 的结果调用 Field.numericValue(),并将结果转换为 Integer.

  • 您还应该在 set() 方法中存储 ID 的唯一字符串表示形式:

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

3 - What is the objectToString method used for?

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

It is important?

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

  • 它 returns 两个不同的复合 ID 有两个不同的值
  • 它总是 returns 给定复合 ID 的相同值