spring JPA постепенно сохраняет объект

#java #jpa #spring-mvc

#java #jpa #spring-mvc

Вопрос:

Я пытаюсь постепенно сохранять сущность.

Вот обзор класса Entity

 
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;
    }
  

Теперь у меня есть двухэтапный процесс, подобный мастеру, где на первом экране
пользователь вводит некоторые свойства объекта, и объект объединяется,
На втором шаге заполняются дополнительные или остальные свойства.

Я использую контроллер на основе аннотаций spring 3, где я использую класс entity в качестве командного объекта.

На первом этапе объект сохраняется со значениями первого экрана, затем я отправляю ссылку из merge в качестве командного объекта для второго экрана.

Однако второй экран, похоже, заполняет записи там, но аннулирует существующие свойства, которые были на первом экране.

Вот код контроллера для того же

 
    @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();
    }
}
  

В качестве альтернативы, если вам действительно по какой-то причине требуется инкрементное сохранение, вы можете загрузить текущее состояние объекта из базы данных и скопировать поля с данными из объекта модели вручную.