2016-09-07 32 views
0

// LoginDAO,逻辑,UI值保存到DB ......越来越添加新值和旧值被替换同值DB多次

System.out.println("In Vendor registration i.e LoginDAO class::::::::::"+vendorRegistration.getVid()+""+""+vendorRegistration.getFirstName()); 
       Session session = getSession();        
       session.beginTransaction();            //begin transaction for the session. 
       Query query = session.createQuery("UPDATE VendorRegistration set firstName =:firstname,lastName =:lastname,Email =:email,password =:password,Vid =:vid "); 

       query.setParameter("firstname",vendorRegistration.getFirstName()); 
       query.setParameter("lastname",vendorRegistration.getLastName()); 
       query.setParameter("email",vendorRegistration.getEmail()); 
       query.setParameter("password",vendorRegistration.getPassword()); 
       query.setParameter("vid",vendorRegistration.getVid());    

       int user = query.executeUpdate(); 

       session.save(vendorRegistration); 
       System.out.println("user values are ::::::::::::::::::"+user); 
       session.getTransaction().commit();       //here transaction complete with commit the data in db. 
       session.close(); 



// Controller class 

@RequestMapping(value = {"/signup"}, method = RequestMethod.POST) 
    public String saveRegAction(@ModelAttribute("signup") @Validated VendorRegistration vendorRegistration, Model model,HttpSession session,BindingResult bindingResult) throws IOException 
    { 
     System.out.println("the object is:" + model); 
     if(bindingResult.hasErrors()) 
     { 
      logger.info("user details===========" +vendorRegistration.getFirstName()+""+vendorRegistration.getLastName()+""+vendorRegistration.getVid()+""+vendorRegistration.getEmail()+""+vendorRegistration.getPassword()); 
      logger.info("Returning home.jsp page"); 

      model.addAttribute("vendor", new VendorRegistration()); 
      return "signup"; 
     } 
     loginService.saveNewUser(vendorRegistration); 
     session.setAttribute("vendorRegistration", vendorRegistration); 

     logger.info("in registration page........... save register action"); 
     return "vendorLogin"; 

//值保存多次保留旧值和保存新值到DB

![这是DB的问题] [1] [1]

// POJO类

@Entity 
@Table(name = "VendorRegistration") 
public class VendorRegistration { 


    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 


    @Column(name = "VID") 
    private String vid; 

    @NotBlank 
    @Column(name = "FIRSTNAME") 
    private String firstName; 

    @Column(name = "LASTNAME") 
    private String lastName; 

    @Column(name = "EMAIL") 
    @Email(message="Please Enter Valid Email ID") 
    private String email; 

    @Column(name ="PASSWORD") 
    private String password; 
//getters and setters 
+1

首先,你为什么执行查询并保存实体?删除你的查询并执行is。你只能使用'session.save(你的实体)'。你也不应该在模型出现错误时向模型添加一个新的VendorRegistration(),它已经添加了,不要再添加它。 –

回答

2

代码中存在一些错误/缺陷。首先你的控制器,它有一个错误的方法签名。

首先解决方法签名,该BindingResult必须直接跟随它适用于你的情况@ModelAttribute注释元素的方法参数。

@RequestMapping(value = {"/signup"}, method = RequestMethod.POST) 
public String saveRegAction(@ModelAttribute("signup") @Validated VendorRegistration vendorRegistration, BindingResult bindingResult, Model model,HttpSession session,) throws IOException { ... } 

你的数据库问题是由于你的服务/ dao方法的实现。您首先执行更新查询并最终插入它。所以会发生什么是首先更新所有内容,然后插入新记录。你应该只有session.save没有更多的东西在你的方法。

Session session = getSession();        
session.beginTransaction();             

session.save(vendorRegistration); 
session.getTransaction().commit();       
session.close(); 

这是你的代码的其余部分仍然但是有缺陷,因为它可能会导致连接池的饥饿中的错误/异常情况。您应该在代码中使用try/catch/finally。 (或者更好的让Spring通过使用Spring管理事务为你做到这一点)。

final Session session = getSession(); 
try { 
    session.beginTransaction(); 
    session.save(vendorRegistration); 
    session.getTransaction().commit();       
} catch (Exception e) { 
    session.getTransaction().rollback(); 
} finally {  
    session.close(); 
} 

你基本上需要类似的东西,每一种方法与会议一起工作。如果您不这样做,那么您的Session可能会处于闲置状态并使用连接池中的连接。如果发生这种情况,您的应用程序将会死亡或开始爬行。

更好的是使用Spring管理的事务。

@Transactional 
public saveNewUser(VendorRegistration vendorRegistration) { 
    sessionFactory.getCurrentSession().save(vendorRegistration); 
} 

Spring现在为您管理会话和事务。

专业提示:不要使用普通的hibernate,而是使用JPA并使用Spring Data JPA。那么你只需要这个。

interface VendorRegistrationRepository extends JpaRepository<Long, VendorRegistration> {} 

没有实现,只有一个接口,一切都为您管理。

+0

已接受,它解决了我的问题 – Hema

+0

接受...如果可能,你可以简要介绍一下你的pro-tip ....关于你提到的那个接口 – Hema

+0

这些都在Spring Data JPA指南中解释过。你只需要扩展一个接口,就可以完成你所需要的所有功能(保存,更新等),而无需执行任何操作。 –

0

您的问题是在

Query query = session.createQuery("UPDATE VendorRegistration set firstName =:firstname,lastName =:lastname,Email =:email,password =:password,Vid =:vid "); 

你还没有添加where子句。所以所有记录都在更新。

+0

为什么他甚至使用更新查询? –

+0

我该如何回答:p。也许他正在尝试为现有用户执行更新操作并为新用户插入操作。但他正试图用相同的查询来完成。 – sAm