2016-09-07 19 views
0

// LoginDAO、DBにUI値を保存するためのロジックが...新しい値が追加取得され、古い値が同じ値が複数回

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

に新しい値を保存![これは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(your-entity)'を使うべきです。また、エラーが発生した場合にモデルに新しい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 { ... } 

あなたのデータベースの問題は、service/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); 
} 

春はあなたのセッションとトランザクションを管理するようになりました。

Proヒント:プレーンなハイバーネーションは使用しないでくださいが、JPAを使用し、それと一緒にSpring Data JPAを使用してください。それであなたはこれだけ必要です。

interface VendorRegistrationRepository extends JpaRepository<Long, VendorRegistration> {} 

実装されていないため、インターフェイスのみが管理されます。

+0

私の問題を解決し、それを解決しました – Hema

+0

可能であれば、あなたはabt ur pro-tipについて簡単に説明できます。そのインタフェースについては、 – Hema

+0

を参照してください。それはすべてSpring Data JPAガイドで説明されています。インターフェイスを拡張するだけで、何も実装する必要なく、必要なすべての処理(保存、更新など)ができます。 –

0

あなたの問題は、あなたがwhere句を追加していない

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

です。したがって、すべてのレコードが更新されています。

+0

彼はなぜ更新クエリを使用していますか? –

+0

どうすればいいのでしょうか?おそらく、彼は既存のユーザーの更新操作を行い、新しいユーザーの操作を挿入しようとしているかもしれません。しかし、彼は同じ質問でそれをやろうとしています。 – sAm

関連する問題