This is my project environment:
Code:
jdk 1.6
spring 2.5.2
hibernate-entitymanager 3.3.1.GA
hibernate-annotations 3.3.0.GA
hibernate-core 3.2.6.GA
hibernate-search 3.0.1.GA
lucene-core 2.3.0
I am trying for hibernate search and spring.
My service class:
Code:
private EntityManager entityManager;
private FullTextEntityManager searchManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public FullTextEntityManager getSearchManager() {
if (null == searchManager) {
searchManager = Search.createFullTextEntityManager(getEntityManage r());
}
return searchManager;
}
public Page<T> search(Page page, String keywords, String[] fields, SortField... sortFields) {
FullTextQuery query = createSearchQuery(keywords, fields, sortFields);
int resultSize = query.getResultSize();
page.setResultCount(resultSize);
if (resultSize < 1) return page;
page.setItems(query.setFirstResult(page.getFirstRe sult()).setMaxResults(page.getSize()).getResultLis t());
return page;
}
public FullTextQuery createSearchQuery(String keywords, String[] fields, Analyzer analyzer, Class... classes) {
QueryParser parser = fields.length > 1 ? new MultiFieldQueryParser(fields, analyzer) : new QueryParser(fields[0], analyzer);
org.apache.lucene.search.Query query;
try {
query = parser.parse(keywords);
} catch (ParseException e) {
throw new org.gaozou.kevin.utility.SimpleException("Could not parse keywords: " + keywords, e);
}
return getSearchManager().createFullTextQuery(query, classes);
}
My applicationContext.xml:
Code:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityMana gerFactoryBean">
<property name="persistenceUnitName" value="tvlist"/>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionM anager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* org..manager..*(..)) or execution(* org..*Manager*.*(..)) or execution(* org..*DAO*.*(..))"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="page*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
The search works at once,
but when I try to search second time it gives this Exception:
Code:
org.hibernate.SessionException: Session is closed!
org.hibernate.impl.AbstractSessionImpl.errorIfClos ed(AbstractSessionImpl.java:49)
org.hibernate.impl.SessionImpl.createCriteria(Sess ionImpl.java:1508)
org.hibernate.search.engine.QueryLoader.load(Query Loader.java:62)
org.hibernate.search.query.FullTextQueryImpl.list( FullTextQueryImpl.java:246)
org.hibernate.search.jpa.impl.FullTextQueryImpl.ge tResultList(FullTextQueryImpl.java:91)
When I change @PersistenceContext to @PersistenceContext(type=PersistenceContextType.EX TENDED), it works.
But the 'extended EntityManager' is not thread-safe, so it's better to use @PersistenceContext.
Please any one help me to resolve this problem.