如何将 @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
,您应该使用自定义 IdentifierBridge
:https://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 的相同值
当有@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
,您应该使用自定义 IdentifierBridge
:https://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 的相同值