Hibernate搜索:NoSuchMethod org.hibernate.engine.transaction.spi.TransactionEnvironment.getJtaPlatform()?

时间:2014-03-05 17:00:11

标签: spring hibernate jpa hibernate-search

我有一个使用spring和hibernate的java项目。我正在集成hibernate搜索以进行全文搜索。由于我已经集成了hibernate搜索,因此无法保存我的实体。我收到以下错误:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.hibernate.engine.transaction.spi.TransactionEnvironment.getJtaPlatform()Lorg/hibernate/engine/transaction/jta/platform/spi/JtaPlatform;

完整的堆栈跟踪在http://pastebin.com/GTthsRv6

当我想为用户保存项目时,我的弹簧控制器:

   @RequestMapping(value="/saveproject", method = RequestMethod.POST)
    public ModelAndView saveProject(@ModelAttribute Project  project,HttpSession session){
         User user = (User) session.getAttribute(USER);
         user.getProjects().add(project);
         ModelAndView modelAndView = new ModelAndView();
         modelAndView.setViewName("projectSuccess");
         modelAndView.addObject("project", project);
         userServices.updateUser(user);
         return modelAndView;
    } 

这里是services部分中的updateUser方法实现:

@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
@Service
public class UserServicesImpl implements UserServices {

@Autowired
    private UserDao userDao;

    public void updateUser(User user) {
            userDao.updateUser(user);

        }
..other methods
}

以下是@Repository的更新用户方法:

@Repository
public class UserDaoImpl extends AbstractDaoImpl<User, Long> implements UserDao {

    protected UserDaoImpl() {
        super(User.class);
    }
    @Override
        public void updateUser(User user) {
            saveOrUpdate(user);

        }
...other methods
}

AbstractDaoImpl:

    public abstract class AbstractDaoImpl<E, I extends Serializable> implements AbstractDao<E,I> {

        private Class<E> entityClass;

        protected AbstractDaoImpl(Class<E> entityClass) {
            this.entityClass = entityClass;
        }

        @Autowired
        private SessionFactory sessionFactory;

        public Session getCurrentSession() {
            return sessionFactory.getCurrentSession();
        }


        @Override
        public void saveOrUpdate(E e) {
            getCurrentSession().saveOrUpdate(e);
        }

    ... others methods


        public void indexDatabase(){
            Session session  = getCurrentSession();
            FullTextSession fullTextSession = Search.getFullTextSession(session);  
            try {
                fullTextSession.createIndexer().startAndWait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }

}

在我的hibernate.cfg.xml中配置索引:

的文件系统   E:\工作空间\索引

我使用hibernate 4.2和hibernate search 4.5。我不明白问题出在哪里。

2 个答案:

答案 0 :(得分:6)

Hibernate ORM的错误版本与Hibernate Search 4.5一起使用。方法getJtaPlatform存在,但返回类型不同。

在Hibernate 4.2方法中,TransactionEnvironment.getJtaPlatform()返回
org.hibernate.service.jta.platform.spi.JtaPlatform

在Hibernate 4.3中它返回:
org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform

Hibernate Search 4.5需要Hibernate 4.3。这记录在例如here

  

你需要hibernate-core-4.3.1.Final.jar及其传递依赖

答案 1 :(得分:1)

我也有这个问题。我在maven项目中使用了hibernate-search 4.5 Final。 Maven导入了正确的依赖项,如hibernate-code 4.3等等,但这个问题仍然存在。 经过我们的调试甚至进入hibernate-core JAR后,我放弃并尝试了 hibernate-search-orm 4.0 Final和hibernate-core 4.0 Final 。异常消失了,他发现了缺失的方法。 这是一个非常奇怪的行为...... 我知道这不是一个明确的解决方案,但是如果你能够使用4.0版

它就有效