2013-11-05 19 views
3

我在將EAR項目部署到Wildfly 8 beta1時遇到問題。該項目使用Hibernate Search 4.5 Alpha 1.有一些實體索引。該項目生成良好,但部署時引發異常:無法在java.lang.Byte中猜出FieldBridge作爲id。我嘗試禁用所有hibernate搜索註釋,但仍然出現異常。接縫是一個錯誤。有什麼建議麼?Hibernate搜索4.5 Alpha 1無法在java.lang.Byte中猜出FieldBridge爲id

at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:169) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1] 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1] 
at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.7.0_25] 
at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:463) [wildfly-security-manager-1.0.0.Beta3.jar:1.0.0.Beta3] 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:178) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_25] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_25] 
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_25] 
at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.1.Final.jar:2.1.1.Final] 
Caused by: org.hibernate.search.SearchException: HSEARCH000135: Unable to guess FieldBridge for id in java.lang.Byte 
at org.hibernate.search.bridge.impl.BridgeFactory.guessType(BridgeFactory.java:432) 
at org.hibernate.search.engine.metadata.impl.AnnotationMetadataProvider.checkDocumentId(AnnotationMetadataProvider.java:159) 
at org.hibernate.search.engine.metadata.impl.AnnotationMetadataProvider.initializeMemberLevelAnnotations(AnnotationMetadataProvider.java:625) 
at org.hibernate.search.engine.metadata.impl.AnnotationMetadataProvider.initializeClass(AnnotationMetadataProvider.java:324) 
at org.hibernate.search.engine.metadata.impl.AnnotationMetadataProvider.getTypeMetadataFor(AnnotationMetadataProvider.java:118) 
at org.hibernate.search.engine.spi.AbstractDocumentBuilder.<init>(AbstractDocumentBuilder.java:100) 
at org.hibernate.search.engine.spi.DocumentBuilderContainedEntity.<init>(DocumentBuilderContainedEntity.java:62) 
at org.hibernate.search.spi.SearchFactoryBuilder.initDocumentBuilders(SearchFactoryBuilder.java:342) 
at org.hibernate.search.spi.SearchFactoryBuilder.buildNewSearchFactory(SearchFactoryBuilder.java:217) 
at org.hibernate.search.spi.SearchFactoryBuilder.buildSearchFactory(SearchFactoryBuilder.java:141) 
at org.hibernate.search.hcore.impl.HibernateSearchSessionFactoryObserver.sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:74) 
at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:52) 
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:581) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1837) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:854) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:847) 
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:396) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:846) 
at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:151) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1] 
... 8 more 

這是再現異常實體的例子:

@Entity 
@Table(name = "flow") 
public class Flow implements java.io.Serializable { 

private static final long serialVersionUID = 3556704047257784867L; 
private Byte id; 
private String name; 
private String description; 

public Flow() { 
} 

public Flow(String name) { 
    this.name = name; 
} 

public Flow(String name, String description) { 
    this.name = name; 
    this.description = description; 
} 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
public Byte getId() { 
    return this.id; 
} 

public void setId(Byte id) { 
    this.id = id; 
} 

@Column(name = "name", nullable = false, length = 60) 
@NotNull 
@Length(max = 60) 
public String getName() { 
    return this.name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@Column(name = "description", length = 400) 
@Length(max = 400) 
public String getDescription() { 
    return this.description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

}

如果ID從字節改爲短工作正常。 Byte沒有內置的橋接。也許這是相關的,但主要問題是爲什麼如果我沒有hibernate搜索註釋,hibernate搜索正在尋找橋樑?

+0

也許這個錯誤是有關:https://hibernate.atlassian.net/browse/HSEARCH-1447 – Tvori

+0

你能請附上沒有實體的HSEARCH -1447錯誤?如果沒有觸發問題的映射實體的例子,我認爲我無法修復它。 – Sanne

+0

我編輯了這個問題並添加了一個拋出異常的實體。 – Tvori

回答

1

一個快速的解決方法 - 可以創建一個ByteBridge:

public class ByteBridge extends NumberBridge implements Serializable { 
public Object stringToObject(String stringValue) { 
    if (StringHelper.isEmpty(stringValue)) return null; 
    return Byte.valueOf(stringValue); 
} 
} 

,然後添加批註實體:

@FieldBridge(impl=....) 
1

我嘗試定製FieldBridge路線,但原來Hibernate Search的字節轉換字段添加到FieldBridge之前的Integer對象。這意味着只需添加正常IntegerBridge工作解決該問題:

@FieldBridge(impl = IntegerBridge.class)