0 Replies Latest reply on Mar 26, 2009 11:54 AM by ralf

    How should i design the following scenario

    ralf

      I have three Beans:


      1. EntityHandler (handles EntityA, EntityB, ... EntityZ)
      2. ProfileHandlerA (handles ProfileA via Conversations)
      3. ProfileHandlerB (handles ProfileB via Conversations)


      Entity1 and Entity2 contain a lot of EntityA ... EntityZ or Sets of them


      Lets start with dhe EntityHandler (not to confuse with the EntityManager): the EntityHandler is some Kind of Wrapper for many many Entities /
      List of Entities which i would like to use in many different views (e.g. as a  <s:selectItem> ). So i want to follow the rule, to code this functionality only once.


      Lets talk about the ProfileHandlerA and ProfileHandlerB:
      They manage ProfileA or ProfileB, which contain Entities, which i were selected in the View, which was filled by the Content of the EntityHandler.


      My Idea: is to put the EntityHandler in the ApplicationScope, to load them only once the application starts up.


      But i have one Problem.
      Everythings works fine, if i create a new Instance of Entity1 with the ProfileHandlerA in a Conversation and persist it. In my different views i can go back and forward.
      But if i load an existing Instance of the Entity1, in the view the s:selectItem is not selected.


      I tried to load the Entity Lists in the ProfileHandler and show them in the view, it works --> but it sucks - because i dont want to recode the functionaliy. This must be possible!


      Where is my error in reasoning? Can Someone give me a hint, how to design the architecture?



      My EntityHandler:


      @Stateful
      @Scope(ScopeType.APPLICATION )
      @Name("entityHandler")
      public class EntityHandler implements EntityHandlerLocal{
      
          @PersistenceContext( type = PersistenceContextType.EXTENDED )
          private EntityManager entityManager;
      
          @Factory( value="possibleSizes" )
          public List<Size> getSizeList( ){
              //noinspection unchecked
              return (List<Size>) entityManager.createQuery( "from Sizeorder by id" ).getResultList();
          }
      
          // ... and many many more
      }
      
      




      My ProfileHandlerA:


      @Stateful
      @Scope(ScopeType.CONVERSATION)
      @Name("profileHandlerA")
      public class ProfileHandlerA implements ProfileHandlerALocal{
      
          @Logger
          private Log logger;
      
          @PersistenceContext(type = PersistenceContextType.EXTENDED )
          private EntityManager entityManager;
      
          private ProfileA profilA
          ...
      
          public ProfileA ProfileA() {
              return this.profileA;
          }
      
          ...
          @begin( nested = true )
          public void select( ){
             this.profilA = entityManager.createQuery( "from ProfileA where ..." ).getSingleResult();
          }
      
          @End
          public void save( ){
             this.entityManager.persist( this.profilA );
          }
          ...
      }



      My ProfileA:


      @Entity
      @Name("ProfilA")
      @Table(name="ProfilA")
      public class ProfilAimplements Serializable {
      
          @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
          private long id;
          @Column(nullable = false) @Length(min = 36, max = 36)
          private String uuid;
      
          @ManyToOne( optional = true,  fetch = FetchType.LAZY ) @JoinColumn( nullable = true )
          private Size size;
      
          @ManyToMany( fetch = FetchType.LAZY, cascade = CascadeType.PERSIST ) @JoinColumn( nullable = true )
          private Set<EntityB> bEntities;
      
          // many another Entities...
      
          // empty constructor, getter, setter ...
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (!(o instanceof ProfilA)) return false;
      
              ProfilA that = (ProfilA) o;
      
              if (id != that.getId()) return false;
      
              return true;
          }
      
          @Override
          public int hashCode() {
              return (int) (id ^ (id >>> 32));
          }
      }



      My View:


      <rich:tab label="Single">
          <h:form id="singledatenform">
              <s:validateAll>
                  <h:panelGrid columns="1">
                      <h:column><h:commandButton action="#{benutzerProfilHandler.actionSpeichern}" value="Änderungen speichern" /></h:column>
                      <h:column>
                          <h:panelGrid columns="2">
      
                              <h:column>Ich suche nach einer/einem:</h:column>
                              <h:column>
                                  <h:selectOneMenu id="cmbGeschlechtDu" value="#{profileHandlerA.profilA.size}">
                                  <s:selectItems  value="#{possibleSizes}" var="size"
                                                  label="#{size.name}" noSelectionLabel="please select" hideNoSelectionLabel="false"/>
                                      <s:convertEntity/>
                                  </h:selectOneMenu>
                              </h:column>
                              <h:column> </h:column>
                              <h:column><h:message for="cmbSize" showSummary="true" /></h:column>
      
                          </h:panelGrid>
                      </h:column>
                      <h:column><h:commandButton action="#{profileHandlerA.save}" value="Änderungen speichern" /></h:column>
                  </h:panelGrid>
              </s:validateAll>
          </h:form>
      </rich:tab>