Te same dane na requestach JSF.

0

To moje początki z aplikacjami webowymi i jak widać nie wszystko jeszcze rozumiem. Mam prosty formularz dodający zgłoszenia do bazy danych. Problem pojawia się gdy pracuje kilku użytkowników jednocześnie na róznych requestach aplikacji. Dla każdeo z użytkowników tworzony jest obiekt Request (tutaj wszystko jest ok). Dla każdego z nich również tworzę listę obiektów: RequestEntity której częścia id jest id wcześniej utworzonego Request (niżej formularz uzupełniania właśnie tych obiektów). I tutaj pojawia się mój problme w chwili gdy 2 bądz więcej użytkowników pracje jednocześnie w aplikacjie wszyscy otrzymują taką sama listę obiektów: RequestEntity (w formularzach widać różne dane ale do bazy danych trafiają takie same - tej osoby która pierwsza wywoła metode zapisu do bazy). Nie rozumiem dlaczego tak się dzieje nie potrafie odszukać błędu, będe wdzięczny za wskazówki.

    <ui:composition>  
          <p:wizard id="addRequestWizard" widgetVar="wiz"  flowListener="#{addRequestBean.onFlowProcess}" >                    
                ...
                      <p:tab id="address" title="Formularz urlopowy"   >                  
                          <p:panel header="Proszę o udzielenie urlopu:"  >
                              <p:messages />
                              <h:panelGrid columns="7" cellpadding="5">                           
                                  <p:selectBooleanCheckbox value="#{addRequestBean.re0.mark}" >  
                                      <p:ajax event="change" update="cal1" />
                                      <p:ajax event="change" update="cal2" />
                                  </p:selectBooleanCheckbox>                            
                                  <h:outputText value="wypoczynkowego " />  
                                  <p:outputLabel style="white-space: pre-wrap; word-wrap: break-word;"/>
                                  <p:outputLabel value="od Dnia:" />                           
                                  <p:calendar  id="cal1" disabled="#{addRequestBean.re0.mark==false}" value="#{addRequestBean.re0.fromDate}"  pattern="dd.MM.yyyy" pages="2" maxlength="10"/>
                                  <p:outputLabel value="do Dnia:" />
                                  <p:calendar id="cal2"  disabled="#{addRequestBean.re0.mark==false}" value="#{addRequestBean.re0.toDate}" pattern="dd.MM.yyyy" pages="2" maxlength="10"/>
                        ...
                      </p:tab>
          </p:wizard>
      </ui:composition>
         <ui:composition>           
                <p:dialog header="Potwierdzenie: " widgetVar="wigetAddRequestDialog" >            
                          <p:commandButton id="wyslijButton" value="Wyślij" action="#{addRequestBean.addRequest()}" />       
                </p:dialog> 
        </ui:composition>

I teraz metody w bean:


@ManagedBean
@ViewScoped

public class AddRequestBean{          
     
   Request request; 
   RequestEntity re0, re1, re2, re3, re4, re5, re6; 
   ArrayList<RequestEntity> lista;
   RequestEntityEmbeddable ree;
   
public AddRequestBean() {
              
        request = new Request(); 
  
        lista = new ArrayList();
        lista.clear();
        
        re0 = new RequestEntity();
        lista.add(re0);
        re1 = new RequestEntity();
        lista.add(re1);
        re2 = new RequestEntity();
        lista.add(re2);
        re3 = new RequestEntity();
        lista.add(re3);
        re4 = new RequestEntity();
        lista.add(re4);
        re5 = new RequestEntity();
        lista.add(re5);
        re6 = new RequestEntity();
        lista.add(re6);
  
       for(int i=0; i<lista.size(); i++){
           ree = new RequestEntityEmbeddable(1, i);
           lista.get(i).setRequestEntityEmbeddable(ree);
        }        
    }  


 public void addRequest() throws IOException, MessagingException, NamingException{
           
        DAO.RequestDAO.addRequest(request, lista);        
}

I zapis do bazy:

public static void addRequest(Request r, ArrayList<RequestEntity>list) throws IOException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx=null;       
        
        try{
            tx = session.beginTransaction();  
            
            session.save(r);
            tx.commit();
            
            for(int i=0; i<list.size(); i++){
                RequestEntity re = list.get(i);
                RequestEntityEmbeddable ree = new RequestEntityEmbeddable(r.getId(), i); 
                re.setRequestEntityEmbeddable(ree);              
 
                DAO.RequestEntityDAO.addRequestEntity(re);}
            
            }
        catch (Exception e) {if (tx!=null) tx.rollback();e.printStackTrace();}
        finally {session.close();}
    }
0

Już chciałem krzyknąć JSF - uciekaj. Ale w tym przypadku problemem nie jest chyba nawet JSF, tylko zupełnie niejasny sposób składowania danych,
Co to jest RequestEntity i RequestEntityEmbeddable?
I co np. znaczy ten zapis:

           ree = new RequestEntityEmbeddable(1, i);

Co to jest ta jedynka?

EDIT: Ogólnie niestety kod zawiera tyle WTF, że trudno będzie pomóc jeśli nie wrzucisz całości.

0
jarekr000000 napisał(a):

Już chciałem krzyknąć JSF - uciekaj. Ale w tym przypadku problemem nie jest chyba nawet JSF, tylko zupełnie niejasny sposób składowania danych,
Co to jest RequestEntity i RequestEntityEmbeddable?
I co np. znaczy ten zapis:

           ree = new RequestEntityEmbeddable(1, i);

Co to jest ta jedynka?

EDIT: Ogólnie niestety kod zawiera tyle WTF, że trudno będzie pomóc jeśli nie wrzucisz całości.

Tak też właśnie myślalem. RequestEntityEmbeddable jest to klucz złożony klasy RequestEntity Składa się on z ID Request oraz numery sekci (od 0 do 6).Jeśli chodzi o zapis do bazy Request id ma ustalona jako autoincrement tak więć przed zapisem wiersz nie jestem w stanie ustalić jego id i wstawić go do id RequestEntity. Dlatego wstawiem tu jedynke a potem w DAO, koryguje ten zapis o poprawne już id. Nie w tym tkwi problem, to dziala poprawnie. Co ciekawe problem występuje tylk ogdy użytkownicy pracują na różnych komputerach gdy dodaje dane na tej samej maszynie wszystko jest ok.

0

Wygenerowałem nowe klasy: hashCode() dla tych problematycznych klas (niby takie sam jak było wcześniej), zrobilem z 50 prób i za każdym razem jest poprawnie. Będe obserwował.

1

Raczej mało prawdopodobne, żeby hashCode miał coś z problemami wspólnego. Ten kod powyżej ma tyle dziwactw, że w zasadzie trzeba by całość (wszystkie pliki) przeanalizować i zastanowić się jak to najmniejszym kosztem naprawić. Na pierwszy rzut oka wygląda na to, że wystarczy wywalić tak 80% kodu z napisanego w Javie i bedzie dobrze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1