1 Reply Latest reply on Oct 28, 2007 11:13 AM by pmuir

    [newbie] strategy and implementation of nested java.util.Set

    bolke

      Hello,

      Before I start out with my question I would like to tell you upfront that I am quite new to Seam/EJB3/JSF, I am certain that parts of my question will be a little offtopic with regards to the forum topic. However I did actually search the net and did not really find a solution: most of the information was outdated (old examples for JSF1) or did not describe something along the lines I wanted to do. So far for the disclaimer ;-)

      Software used:


      JBoss 4.2.1
      Seam 2.0CR2
      JSF 1.2


      I am trying to setup an application with generates lists of allowed chemicals for inland vessels. These lists are multilingual, eg a list can be generated in several languages.

      The chemical entity looks like this:

      @Entity
      public class Chemical implements Serializable {
       private static final long serialVersionUID = -81501463360195381L;
      
       private int id;
       private int un;
      
       private int maxFillRate;
       private boolean allowPumpRoom;
       private TemperatureClass temperatureClass;
       private boolean explosionProtection;
       private double density;
       private String classification;
       private int relievePressure;
      
       private Date updated;
       private User updatedby;
      
       private String classificationCode;
       private String packageGroup;
      
       private int bluelights;
      
       transient private boolean removed;
       transient private Vector<String> removedBy = new Vector<String>();
      
       private Set<ChemicalNote> notes;
       private Set<Compatibility> compatibility;
       private Set<Danger> dangers;
       private Set<Equipment> equipment;
      
       private SamplingDevice samplingDevice;
      
       private Set<Translation> translations;
      
       // getters and setters
      }
      


      I will focus on the translations part, which is the part I am having trouble with.

      @Entity
      public class Translation implements Serializable {
      
       private static final long serialVersionUID = 3885895866444687204L;
      
       private int id;
      
       private Chemical chemical;
       private String name;
       private String language;
      
       private User updatedby;
       private Date updated;
      
      }
      



      On the page showing the list of chemicals I would like to show the translation for the name of the chemical. There is a very basic backingbean:

      @Name("chemical")
      @Scope(CONVERSATION)
      @Stateful
      public class ChemicalAction implements Serializable, ChemicalInterface {
       private static final long serialVersionUID = -5723276978457496053L;
      
       @PersistenceContext
       EntityManager em;
      
       @Logger
       Log log;
      
       @In
       FacesContext facesContext;
      
       public java.util.List<Chemical> getChemicals() {
      
       java.util.List<Chemical> chemicals =
       em.createQuery("select c from Chemical c order by c.un").getResultList();
      
       return chemicals;
       }
      
       ...
      }
      


      and a little snippet of the xhtml page:

       <ui:repeat value="#{chemical.chemicals}" var="c">
       #{c.id} - #{c.un} - <ui:repeat value="#{c.translations}" var="t">#{t.name}</ui:repeat> <br />
       </ui:repeat>
      


      As you can see I try to loop through all the chemicals (which works) and also through all the translations (which does not work - it generates "Property 'name' not found on type org.hibernate.collection.PersistentSet").

      Well the question boils down to: How can I select just one item from a java.util.Set based on the current locale?

      Additional questions could be:

      Does this need a custom component?
      If so, can I add java.util.Set to a tld?
      How to work around this error?


      If additional information is needed, I will be happy to provide it. Thanks in advance.