0 Replies Latest reply on Mar 26, 2009 11:54 AM by Ralf H.

    How should i design the following scenario

    Ralf H. Newbie

      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:

      @Scope(ScopeType.APPLICATION )
      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:

      public class ProfileHandlerA implements ProfileHandlerALocal{
          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();
          public void save( ){
             this.entityManager.persist( this.profilA );

      My ProfileA:

      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 ...
          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;
          public int hashCode() {
              return (int) (id ^ (id >>> 32));

      My View:

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