【问题标题】:FullTextEntityManager hibernate search "Session is closed"FullTextEntityManager 休眠搜索“会话已关闭”
【发布时间】:2014-04-04 15:42:47
【问题描述】:

我正在尝试使用 FullTextEntityManager(和 Spring),但出现“会话已关闭”异常。我第一次可以很好地查询,但是第二次抛出异常。这是我的配置:

@Service
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public class SearchServiceImpl extends BaseService implements SearchService {

    public List<StrainSearchResultsListItem> advancedSearch(Pageable page,String species) {
      return searchRepository.advancedSearch(page,   species);
   }

回购实施:

@Repository
@Transactional(readOnly = true)
public class SearchRepositoryImpl implements SearchRepository {

  @PersistenceContext
   public void setEntityManager(EntityManager entityManager) {
      this.entityManager = entityManager;
   }

   protected FullTextEntityManager getFullTextEntityManager() {

      if (fullTextEntityManager == null) {
         fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager());
      }

      return fullTextEntityManager;
   }

当我第二次调用 fullTestQuery.getResultList() 时,它会抛出“会话已关闭”异常。

FullTextQuery fullTextQuery = 
         getFullTextEntityManager()
            .createFullTextQuery(booleanQuery, Strain.class);
fullTextQuery.getResultList()

感谢任何想法。

谢谢

【问题讨论】:

  • 您可以发布您的实体代码吗?似乎在加载任何惰性依赖项之前,您的会话已关闭,因此出现此错误。

标签: java spring hibernate


【解决方案1】:

可能是您忘记在 spring 配置文件中启用 TransactionManagement。 @EnableTransactionManagement 到 spring 配置文件以启用事务管理。

【讨论】:

    【解决方案2】:

    你的实体类应该是这样的-

    @Entity
    @Table(name="keywordsentity")
    @Indexed
    @AnalyzerDef(
              name="fulltext",
              tokenizer=@TokenizerDef(factory=StandardTokenizerFactory.class),
              filters={
                @TokenFilterDef(factory=LowerCaseFilterFactory.class),
                @TokenFilterDef(factory=SnowballPorterFilterFactory.class, 
                  params={@Parameter(name="language", value="English") })
              }
            )
    public class Keywordsentity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @JsonProperty
        //index = Index.YES, analyze=Analyze.YES, store = Store.YES
        @Field
        @Analyzer(definition="fulltext") 
        private String keywordname;
    

    你的服务类应该是这样的

    @Service
    public class KeywordService {
    
    
        @PersistenceContext(type = PersistenceContextType.EXTENDED, name = "keywordPU")
        private EntityManager em;
    
        private FullTextEntityManager ftem;
    
          public void updateFullTextIndex() throws Exception {
    
                getFullTextEntityManager().createIndexer().startAndWait();
            }
    
    
    
        protected FullTextEntityManager getFullTextEntityManager() {
            if (ftem == null) {
                ftem = Search.getFullTextEntityManager(em);
            }
            return ftem;
        }
    
        @Transactional
          public List<Keywordsentity> search(String summary, String description)
          {
    
    
              String searchString = summary.concat(" ").concat(description);
              System.out.println("searchString-----------------------------"+searchString);
              QueryBuilder qb = getFullTextEntityManager().getSearchFactory().buildQueryBuilder().forEntity(Keywordsentity.class).get();
    
    
        //lucene query
              org.apache.lucene.search.Query query = qb
                        .keyword()
                        .onField("keywordname").matching(searchString)
                        .createQuery();
    
                Query fullTextQuery = getFullTextEntityManager().createFullTextQuery(query, Keywordsentity.class);
    
                System.out.println("fullTextQuery------------------================="+fullTextQuery);
    
                List<Keywordsentity> result = new ArrayList<Keywordsentity>();
                try
                {
                     result = fullTextQuery.getResultList();
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
    
    
    
                System.out.println("size --------------------=========="+result.size());
                for (Keywordsentity keywordone : result) {
                 System.out.println("keyword------------"+keywordone);
                 Map<String,String> team =new HashMap<String,String>();
             Set<Teamsentity> teams=     keywordone.getTeamsentity();
             {
                 for(Teamsentity teamsentityone :teams )
                {
                    String ids = String.valueOf(teamsentityone.getId());
                    team.put("id",ids);
                    team.put("name",teamsentityone.getName());
                    team.put("description",teamsentityone.getDescription());
                }
                 System.out.println("teams =================="+teams);
    
                 }
    
                }
                return result;
          }
    
    }
    

    然后存储库和控制器应该是正常的方式没有别的。 仅依赖一个 -

    <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-search-orm</artifactId>
            <version>5.10.5.Final</version>
        </dependency>
    

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多