0 Replies Latest reply on Jan 2, 2007 4:13 AM by beligum

    Object persistence/rollback misconception

    beligum

      Hello everyone.
      (Perhaps I should start with a little NY-wish, well, this be it)

      I'm trying to wrap my thoughts around the entire ORM concept of JBoss (Hibernate+Seam in particular) and find it a little confusing, since my whole DB-background has been purely relational. I'd truly appreciate it if someone would take the time to explain it to me.

      This is my case: I have a stateful session bean that creates a new mapped user-object (user data) and a new mapped loginEntity-object (login data) when someone tries to register on the register-page. I'm using the same bean as the ajax-callback bean to validate the entered data while registering.

      When the user submits his/her data, the two entity beans are persisted to the DB, but sometimes, things go wrong with one of them, after the other one has been persisted successfully. I want to do a container-managed rollback on the successfully persisted bean, when the other one fails, using the @Rollback annotation, or any suitable other solution.

      Please advise, here is the code:

      @Stateful
      @Scope(CONVERSATION)
      @Name("register")
      public class RegisterAction implements IRegister
      {
       @In(create=true) @Out
       private Person currentUser;
       @In(create=true) @Out
       private LoginEntity loginEntity;
      
       private boolean renderSuccess = false;
      
       ResourceBundle msg = GeneralSettings.getGeneralMessageBundle();
       ResourceBundle regMsg = GeneralSettings.getRegisterMessageBundle();
      
       @In
       private EntityManager em;
      
       //-----CONSTRUCTORS-----
       public RegisterAction()
       {
       }
      
       //-----AJAX CALL ENTRIES-----
       /*
       * Note: if a call is added, removed, also remove it from the register()
       * checklist.
       */
       public String getFirstNameCheck()
       {
       String curVal = currentUser.getFirstName();
       String retVal = null;
      
       if (curVal!=null && curVal.equals("")) {
       retVal = regMsg.getString("missingFirstName");
       }
      
       return retVal;
       }
       ... more ajax-callbacks ...
      
       //-----ACTIONS-----
       public boolean getRenderSuccess()
       {
       return this.renderSuccess;
       }
       @TransactionAttribute(TransactionAttributeType.REQUIRED)
       @Rollback(ifOutcome={"failure"})
       public String register()
       {
       if (this.hasErrors()) {
       return "failure";
       }
      
       //add the loginObject to the entity
       this.loginEntity.setEntity(this.currentUser);
      
       try {
       this.em.persist(this.currentUser);
       this.em.persist(this.loginEntity);
      
       this.renderSuccess = true;
       }
       catch (Exception e) {
       FacesMessages.instance().add("registerForm", regMsg.getString("registerPersistanceFailure"));
      
       return "failure";
       }
      
       return "success";
       }
       @Remove @Destroy
       public void destroy()
       {
       }
      
       //-----PRIVATE METHODS-----
       protected boolean hasErrors()
       {
       return !(
       getFirstNameCheck()==null &&
       getLastNameCheck()==null &&
       getAddressCheck()==null &&
       getPostalCodeCheck()==null &&
       getCityCheck()==null &&
       getTelephoneCheck()==null &&
       getEmailCheck()==null &&
       getEmailCheck()==null &&
       getPasswordCheck()==null
       );
       }
      }