当存在@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方法用于什么?这很重要吗?
我正在提出这个问题,因为我没有找到任何关于它的文档,所以我不确定。
答案 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字段时。
这很重要吗?
除非你正确实施,否则什么都不会起作用,即除非你确定: