我有一个使用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。我不明白问题出在哪里。
答案 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版
它就有效