2011-04-06 75 views
0

我正在嘗試逐步保存實體。spring JPA逐步保存實體

這裏是實體類

 

package aop.web.teacher.rmodels; 
// Generated 11 Feb, 2011 3:57:41 PM by Hibernate Tools 3.2.2.GA 


import java.util.Date; 

import java.util.HashSet; 

import java.util.Set; 

import javax.persistence.CascadeType; 

import javax.persistence.Column; 

import javax.persistence.Entity; 

import javax.persistence.FetchType; 

import javax.persistence.Id; 

import javax.persistence.JoinColumn; 

import javax.persistence.ManyToOne; 

import javax.persistence.OneToMany; 

import javax.persistence.Table; 

import javax.persistence.Temporal; 

import javax.persistence.TemporalType; 


import org.hibernate.validator.constraints.NotEmpty; 

/** 
* AopTeacherMaster generated by hbm2java 
*/ 
@Entity 
@Table(name="aop_teacher_master" 
    ,schema="public" 
) 
public class AopTeacherMaster implements java.io.Serializable { 


    private long id; 
    private AopTeachersDistrictMaster aopTeachersDistrictMasterByCurrDistrict; 
    private AopInstitutionmaster aopInstitutionmaster; 
    private AopTeachersDistrictMaster aopTeachersDistrictMasterByPermDistrict; 
    @NotEmpty(message="Fathers name is mandatory") 
    private String fathersName; 
    @NotEmpty 
    private String currAddLine1; 
    private String currAddLine21; 
    private String currAddLine22; 
    private String currAddLine3; 
    private String currDevelopmentBlock; 
    private String currPoliceStation; 
    private String currCity; 
    private String currPin; 
    private String currState; 
    private String currCountry; 
    private String permAddLine1; 
    private String permAddLine21; 
    private String permAddLine22; 
    private String permAddLine3; 
    private String permDevelopmentBlock; 
    private String permPoliceStation; 
    private String permCity; 
    private String permPin; 
    private String permState; 
    private String permCountry; 
    private Date dateOfBirth; 
    private Character gender; 
    private Character maritalStatus; 
    private String religion; 
    private String caste; 
    private String landLineNumber; 
    private String mobileNumber; 
    private String email; 
    private String uidNum; 
    private String bankName; 
    private String bankBranch; 
    private String bankAccountNum; 
    private String gpfNum; 
    private Set aopTeachersSanctionedPostDetailsForCurrentIncumbentId = new HashSet(0); 
    private Set aopTeachersSanctionedPostDetailsForFirstIncumbentId = new HashSet(0); 

    public AopTeacherMaster() { 
    } 


    public AopTeacherMaster(long id) { 
     this.id = id; 
    } 
 

現在我有一個2步向導等的過程,其中在第一屏幕 用戶輸入的一些實體和實體的屬性的被合併的概述, 在第二步中,補充或剩餘的屬性被填充。

我使用的是spring 3基於註解的控制器,我使用實體類 作爲命令對象。

在第一個去實體獲取與屏幕一個值,然後我發送合併的 引用作爲第二個屏幕的命令對象。

但是,第二個屏幕似乎填充了那裏的條目,但是取消了第一個屏幕上的 現有屬性。

這裏是相同

 

    @RequestMapping(value = "/insertteacher.html", method = RequestMethod.POST) 
    public 
    String testEm(@Valid AopTeacherMaster teacher, BindingResult result, 
      Map model) { 
     logger.info("Checking Teacher for error"); 
     if (result.hasErrors()) { 
      logger.info("User data has:" + result.getErrorCount() + " errors!"); 
      // //////////////////// 

      for (Object object : result.getAllErrors()) { 
       if (object instanceof FieldError) { 
        FieldError fieldError = (FieldError) object; 

        logger.error("Error on field::" + fieldError.getField() 
          + " || error type ::" + fieldError.getCode()); 
       } 

      } 
      model.put("smessage", "There was an error"); 
      return "teachersmasterInsert"; 
     } 
     logger.info("Attemped saving!"); 
     teacher=schoolMasterService.add(teacher);//recieved the reference after merge! Will be used for command object in the next screen 
     model.put("teacher", teacher);//This is the command object for second screen 
     model.put("smessage", "teacher inserted successfully"); 
     return "teachersmasterInsert2"; 

     // List myList=testDaoService.findAllTeachers(); 
     // for(Teachermaster t:myList){logger.info("Got::"+t.getId());} 

    } 


    @RequestMapping(value = "/insertteacher2.html", method = RequestMethod.POST) 
    public 
    String testEm2(@Valid AopTeacherMaster teacher, BindingResult result, 
      Map model) { 
     logger.info("Checking Teacher for error second insert"); 
     if (result.hasErrors()) { 
      logger.info("User data has:" + result.getErrorCount() + " errors!"); 
      // //////////////////// 

      for (Object object : result.getAllErrors()) { 
       if (object instanceof FieldError) { 
        FieldError fieldError = (FieldError) object; 

        logger.error("Error on field::" + fieldError.getField() 
          + " || error type ::" + fieldError.getCode()); 
       } 

      } 
      model.put("smessage", "There was an error"); 
      return "teachersmasterInsert"; 
     } 
     logger.info("Attemped saving!"); 
     teacher=schoolMasterService.add(teacher); 
     model.put("teacher", teacher); 
     model.put("smessage", "teacher second instance inserted successfully"); 
     return "teachersmasterInsert"; 

     // List myList=testDaoService.findAllTeachers(); 
     // for(Teachermaster t:myList){logger.info("Got::"+t.getId());} 

    } 
 

這是做了正確的方式,控制器代碼?否則 我該如何實現這種增量保存? 請建議! 在此先感謝。

回答

1

以實現基於註解控制器嚮導的典型方法是將部分構造的對象存儲在會話,只剩下最後一步後,將其保存:

@Controller 
// Model attribute with name "aopTeacherMaster" is transparently stored in the session 
@SessionAttribute("aopTeacherMaster") 
public class TeacherController { 
    ... 

    @RequestMapping(value = "/insertteacher2.html", method = RequestMethod.POST) 
    public String testEm2(@Valid AopTeacherMaster teacher, BindingResult result, Map model) { 
     ... 
     // No need to save teacher here 
    } 

    @RequestMapping(value = "/insertteacherLast.html", method = RequestMethod.POST) 
    public String testEmLast(@Valid AopTeacherMaster teacher, BindingResult result, 
     Map model, SessionStatus status) { 
     ... 
     // Save teacher at the last step 
     teacher=schoolMasterService.add(teacher); 
     // Remove it from the session 
     status.setComplete(); 
    } 
} 

或者,如果你真的需要增量保存一些原因,您可以從數據庫加載實體的當前狀態,並手動從模型對象的數據複製字段。