#java #hibernate #hibernate-search
#java #спящий режим #спящий режим-поиск
Вопрос:
При запуске приложения поиска в режиме гибернации в моем журнале появляется следующее:
WARN 23 Jun 2014 15:08:51,623 org.hibernate.search.engine.metadata.impl.TypeMetadata:339 - HSEARCH000120: There are multiple properties indexed against the same field name 'foo.bar', but with different indexing settings. The behaviour is undefined.
Я вижу, что предупреждение регистрируется из:
private Map<String, DocumentFieldMetadata> keyFieldMetadata(Set<PropertyMetadata> propertyMetadataSet) {
Map<String, DocumentFieldMetadata> tmpMap = new HashMap<String, DocumentFieldMetadata>();
for ( PropertyMetadata propertyMetadata : propertyMetadataSet ) {
for ( DocumentFieldMetadata documentFieldMetadata : propertyMetadata.getFieldMetadata() ) {
DocumentFieldMetadata oldFieldMetadata = tmpMap.put(
documentFieldMetadata.getName(),
documentFieldMetadata
);
if ( oldFieldMetadata != null ) {
if ( !documentFieldMetadata.getIndex().equals( oldFieldMetadata.getIndex() ) ) {
**log.inconsistentFieldConfiguration( documentFieldMetadata.getName()** );
}
}
}
}
for ( DocumentFieldMetadata documentFieldMetadata : classBridgeFields ) {
tmpMap.put( documentFieldMetadata.getName(), documentFieldMetadata );
}
if ( idPropertyMetadata != null ) {
for ( DocumentFieldMetadata documentFieldMetadata : idPropertyMetadata.getFieldMetadata() ) {
tmpMap.put( documentFieldMetadata.getName(), documentFieldMetadata );
}
}
return Collections.unmodifiableMap( tmpMap );
}
но у меня возникли проблемы с пониманием цели этого кода или того, как мой код может привести к тому, что он будет соответствовать условию. Похоже, что это происходит только в полях, помеченных @IndexedEmbedded
я Погуглил и ничего не нашел для ошибки.
Я предполагаю, что это всегда было проблемой в коде, но я только недавно обновился с Hibernate Search 4.2.0.Final до 4.5.1.Final, и именно тогда начало появляться предупреждение.
Обновить
@Entity
@Table(name = "data_providers")
@Immutable
@Embeddable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class EDataProvider {
private static final long serialVersionUID = -4207808146855081627L;
public static final String FIELD_ASSOCIATIONS = "associations.";
public static final String FIELD_ID = "id";
private List<EDataProvider> associatedProviders;
private Long id;
private boolean isInternal;
private String name;
private Float priority;
public EDataProvider() {
this(null, null);
}
/**
* @param name
* @param id
*/
public EDataProvider(final String name, final Long id) {
super();
this.name = name;
this.id = id;
associatedProviders = new Vector<EDataProvider>();
}
/**
* @param newProvider
*/
public void addAssociatedProvider(final EDataProvider newProvider) {
associatedProviders.add(newProvider);
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if ((obj == null) || !(obj instanceof EDataProvider)) {
return false;
}
final EDataProvider other = (EDataProvider) obj;
if (!ObjectUtil.equals(getId(), other.getId())) {
return false;
}
return true;
}
@ManyToMany(fetch = FetchType.LAZY,
cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "data_provider_associations",
joinColumns = { @JoinColumn(name = "parent_id") },
inverseJoinColumns = { @JoinColumn(name = "child_id") })
@IndexedEmbedded(depth = 1,
prefix = FIELD_ASSOCIATIONS)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List<EDataProvider> getAssociatedProviders() {
return associatedProviders;
}
@Id
@Column(name = "id")
@Field(name = FIELD_ID)
public Long getId() {
return id;
}
@Column(name = "name")
public String getName() {
return name;
}
@Column(name = "boost")
public Float getPriority() {
return priority;
}
@Override
public int hashCode() {
return EncodingUtil.makeHashCode(31, getId());
}
@Column(name = "internal")
public boolean isInternal() {
return isInternal;
}
public void removeAssociatedProvider(final EDataProvider newProvider) {
associatedProviders.remove(newProvider);
}
/**
* @param newAssociatedProviders
* the associatedProviders to set
*/
public void setAssociatedProviders(
final List<EDataProvider> newAssociatedProviders) {
associatedProviders = newAssociatedProviders;
}
/**
* @param dataProviderId
* the dataProviderId to set
*/
public void setId(final Long dataProviderId) {
id = dataProviderId;
}
public void setInternal(final boolean isInternal) {
this.isInternal = isInternal;
}
/**
* @param name
* the name to set
*/
public void setName(final String name) {
this.name = name;
}
/**
* @param priority
* the priority to set
*/
public void setPriority(final Float priority) {
this.priority = priority;
}
@Override
public String toString() {
return String.format("provider:{id:%d, name:%s, priority:%f}", id, name,
priority);
}
}
Комментарии:
1. Можете ли вы поделиться своей конфигурацией объекта? У вас есть несколько свойств, проиндексированных по одному и тому же полю документа Lucene?
2. @Hardy Я опубликовал объект выше; однако, я полагаю, что нашел подозреваемого. Поле ID было аннотировано в дочернем объекте с
@Field
помощью аннотации, а также включено в индекс родительского объекта. Родительский объект использует пользовательский анализатор, поэтому в настройках индексации произошел конфликт. Как только я удалил@Field
аннотацию из дочернего объекта, ошибки исчезли. Звучит ли это как правильное предположение?
Ответ №1:
Поле ID было аннотировано в дочернем объекте с помощью аннотации @Field, а также включено в индекс родительского объекта. Родительский объект использует пользовательский анализатор, поэтому в настройках индексации произошел конфликт. Как только я удалил аннотацию @Field из дочернего объекта, ошибки исчезли.