代码:
Action层
         /**
 * 添加保存
 */
@Override
public String insertSubmit() throws Exception{
try {
entity.setTwoMentId(filterTwoMenuId);
entityService.save(entity, entityService.getUser().getUsername());
return RELOAD;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}service层: 同时Service层我还有一个根据标题查询方法,/**
 * 添加
 * @param companyGreatInvent
 * @param uName  当前操作人
 */
public synchronized void save(CompanyGreatInvent companyGreatInvent,String uName){
logger.debug("============Service层添加方法开始执行");
try {
//生成ID
java.util.UUID uuid = java.util.UUID.randomUUID();
companyGreatInvent.setCompanyId(uuid.toString());
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
GrantedAuthority[] grantedAuthority = userDetails.getAuthorities();
String authority = "";
for (GrantedAuthority grantedAuthority2 : grantedAuthority) {
authority = grantedAuthority2.getAuthority();
}
if(authority.equals("ROLE_ADMIN")){
//暂时先注释掉,这里是判断Admin添加数据是否选择了定时发布
if(!companyGreatInvent.getTiming().equals("")){
companyGreatInvent.setStatus("5");
}else{
companyGreatInvent.setStatus("0");
}
}else if(authority.equals("ROLE_PM")){
companyGreatInvent.setStatus("1");
}else{
companyGreatInvent.setStatus("2");
}

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String ly_time = sdf.format(new java.util.Date());
companyGreatInvent.setStyleId("1");
companyGreatInvent.setCreateDate(ly_time);
companyGreatInvent.setCreateOperatorId(uName);
if(!this.pubFindInsert(companyGreatInvent.getTitile())){ entityDao.save(companyGreatInvent);
}
} catch (Exception e) {
e.printStackTrace();
}
}根据标题查询的方法:
public boolean pubFindInsert(String title){
List<CompanyGreatInvent> list = entityDao.pubFindInsert(title);
System.out.println("==========:" + list.size());
return list.size() > 0 ? true : false;
}Dao层:/**
 * 添加
 * @param companyGreatInvent
 */
public void save(CompanyGreatInvent companyGreatInvent){
try {
logger.debug("==============Dao层添加方法开始执行");
this.getHibernateTemplate().save(companyGreatInvent);
} catch (Exception e) {
e.printStackTrace();
}
}我的思路是: 当我添加的时候Hibernate会重复提交两次 我在插入之前先查询数据,根据用户输入的标题 如果数据库中有则不插入,不存在插入 。 现在的问题是 偶尔还是会重复提交。
不知道以前有遇到过类似问题的大神们有什么好的解决方法。

解决方案 »

  1.   

    防止表单重复提交在页面的form表单中使用struts2的token标签
    <s:token />在action中加入token拦截器即可
      

  2.   

    hibernate是无法解决表单重复提交的,可以用struts的表单重复提交验证
      

  3.   


    你说的方法我知道。 刚开始我就是用这个方法 。在页面加入<s:token /> 这个标签,在IE8下基本上每次提交都会重复提交,但在火狐、谷歌下重复提交的概率很低,而且总不能每次重复提交都指向到重复提交的页面吧! 用户明明就提交了一次就到了重复提交的页面这样用户的体验感很差。