3 Replies Latest reply on Sep 3, 2007 10:08 AM by przadka

    problems with refreshing view after entity change

    przadka

      Hello,

      I am a seam beginner and after 3 weeks of evaluation I am totally impressed by it. Right now I am developing a test application and I came across a problem which seems very easy but I coudnt find any solution on the forum.

      What I have is a view with a form which displays entity beans (the view file was generated by seam-gen and modified). In the form I have a link which is binded to a session bean action. In the session bean I change the currently displayed entity and than redirect back to the same view page.

      And now the problem: althought the entity is correctly changed (which can be seen in the database) the change cannot be seen in the view after we are done with the session bean.

      When I navigate to some other page and back to the view I can see changes so it has definately something do to with page refreshing.

      Can anyone help?

      And here is my code, if anyone is interested

      entity bean Research.java:

      @Entity
      public class Research implements Serializable {
      
       private static final long serialVersionUID = 7974073555607550091L;
       private Long id;
       private String name;
       private Client client;
      
       private String researcherDescription;
       private String dataTableName;
       private String description;
       private boolean active;
      
       private Date dateCreated;
      
       private ResearchConfiguration researchConfiguration;
      
       private String dataFileName;
       private InputStream dataFileData;
      
       public Research() {
       researchConfiguration = new ResearchConfiguration();
       this.dateCreated = new Date(System.currentTimeMillis());
       }
      
       @Id
       @GeneratedValue
       public Long getId() {
       return id;
       }
      
       public void setId(Long id) {
       this.id = id;
       }
      
       @Length(max = 20)
       @Column(unique=true)
       public String getName() {
       return name;
       }
      
       public void setName(String name) {
       this.name = name;
       }
      
       @ManyToOne
       public Client getClient() {
       return client;
       }
      
       public void setClient(Client client) {
       this.client = client;
       }
      
       public String getResearcherDescription() {
       return researcherDescription;
       }
      
       public void setResearcherDescription(String researcherDescription) {
       this.researcherDescription = researcherDescription;
       }
      
       @Column(unique=true)
       public String getDataTableName() {
       return dataTableName;
       }
      
       public void setDataTableName(String dataTableName) {
       this.dataTableName = dataTableName;
       }
      
       public String getDescription() {
       return description;
       }
      
       public void setDescription(String description) {
       this.description = description;
       }
      
       @NotNull
       public boolean isActive() {
       return active;
       }
      
       public void setActive(boolean active) {
       this.active = active;
       }
      
       public Date getDateCreated() {
       return dateCreated;
       }
      
       public void setDateCreated(Date dateCreated) {
       this.dateCreated = dateCreated;
       }
      
       @OneToOne(cascade = CascadeType.ALL)
       public ResearchConfiguration getResearchConfiguration() {
       if (researchConfiguration == null) {
       researchConfiguration = new ResearchConfiguration();
       }
       return researchConfiguration;
       }
      
       public void setResearchConfiguration(
       ResearchConfiguration researchConfiguration) {
       this.researchConfiguration = researchConfiguration;
       }
      
      
       public String getDataFileName() {
       return dataFileName;
       }
      
       public void setDataFileName(String dataFileName) {
       this.dataFileName = dataFileName;
       }
      
       @Transient
       public InputStream getDataFileData() {
       return dataFileData;
       }
      
       public void setDataFileData(InputStream dataFileData) {
       this.dataFileData = dataFileData;
       }
      
      
       public boolean isDataFileSet(){
       return dataFileName!=null;
       }
       public void setDataFileSet(boolean dataFileSet){
      
       }
      
      }
      
      
      


      the session bean ResearchManagerBean.java:

      @Stateful
      @Name("researchManager")
      public class ResearchManagerBean implements ResearchManager {
      
       @Logger
       private Log log;
      
       @In
       FacesMessages facesMessages;
      
       @In(required = false) @Out
       Research research;
      
       @PersistenceContext
       private EntityManager em;
      
       @Destroy
       @Remove
       public void destroy() {
       }
      
       @Override
       @Begin(join = true)
       public String selectResearch(Research research) {
       if (research == null){
       log.info("Research object is null! Cannot select!");
       return null;
       }
       else
       research = em.merge(research);
       return "research";
       }
      
       @Override
       @End
       public String removeData(Research research) {
       if (research == null){
       log.info("Research object is null! Cannot remove!");
       return null;
       }
       else {
       research = em.merge(research);
       em.createNativeQuery("DROP TABLE `"+research.getDataTableName()+"`").executeUpdate();
       log.info("Table "+research.getDataTableName()+" dropped");
       log.info("Removing data from research!");
       research.setDataFileData(null);
       research.setDataFileName(null);
       research.setDataFileSet(false);
       research.setDataTableName(null);
       facesMessages
       .add("Data removed");
       em.persist(research);
       em.flush();
       return "removed";
       }
       }
      
       @End
       public String addDataFile() {
      
       if (research == null){
       log.info("Research null! Something bad happened...");
       return null;
       }
       else {
       em.merge(research);
       log
       .info("New data set for #{research.name} : #{research.dataFileName}");
       facesMessages
       .add("New data set for #{research.name} : #{research.dataFileName}");
       return "dataadded";
      
       }
       }
      
       public Research getResearch() {
       return research;
       }
      
       public void setResearch(Research research) {
       this.research = research;
       }
      
      }
      


      the view research.xhtml:
      <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
       xmlns:s="http://jboss.com/products/seam/taglib"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:rich="http://richfaces.ajax4jsf.org/rich"
       template="layout/template.xhtml">
      
       <ui:define name="body">
      
       <h:messages globalOnly="true" styleClass="message" />
      
       <h:form id="researchForm">
      
       <rich:panel>
       <f:facet name="header">research</f:facet>
      
       <s:decorate id="nameDecoration" template="layout/edit.xhtml">
       <ui:define name="label">Name</ui:define>
       <h:inputText id="name" required="true"
       value="#{research.name}" />
       </s:decorate>
      
       <s:decorate id="clientDecoration" template="layout/edit.xhtml">
       <ui:define name="label">Client:</ui:define>
       <h:selectOneMenu value="#{research.client}"
       required="true" id="client">
       <s:selectItems value="#{clientList.resultList}" var="client"
       label="#{client.name}" noSelectionLabel="Please Select..." />
       <s:convertEntity />
       </h:selectOneMenu>
       </s:decorate>
      
       <s:decorate id="descriptionDecoration" template="layout/edit.xhtml">
       <ui:define name="label">Description:</ui:define>
       <h:inputTextarea id="description" rows="5" cols="65"
       value="#{research.description}" />
       </s:decorate>
      
       <s:decorate id="activeDecoration" template="layout/edit.xhtml">
       <ui:define name="label">Is active:</ui:define>
       <h:selectBooleanCheckbox id="active" required="true"
       value="#{research.active}" />
       </s:decorate>
      
       <s:decorate id="researcherDescriptionDecoration"
       template="layout/edit.xhtml">
       <ui:define name="label">Researcher description:</ui:define>
       <h:inputTextarea id="researcherDescription" rows="5" cols="65"
       value="#{research.researcherDescription}" />
       </s:decorate>
      
       <s:decorate id="dataFileNameDecoration" template="layout/edit.xhtml">
       <ui:define name="label">Used data file name:</ui:define>
       <h:inputText id="dataFileName" immediate="true" enabled="false"
       value="#{research.dataFileName}" disbled="true" readonly="true"/>
       <h:commandLink id="addDataFile" value="Add data >>"
       action="#{researchManager.selectResearch(research)}"
       immediate="true" rendered="#{!research.dataFileSet}"/>
       <h:commandLink id="removeDataFile" value="Remove data >>"
       action="#{researchManager.removeData(research)}"
       immediate="true" rendered="#{research.dataFileSet}" />
       </s:decorate>
      
       <div style="clear: both" />
      
       </rich:panel>
      
       <div class="actionButtons"><h:commandButton id="save"
       value="Save" action="#{researchHome.persist}"
       rendered="#{!researchHome.managed}" /> <h:commandButton id="update"
       value="Save" action="#{researchHome.update}"
       rendered="#{researchHome.managed}" /> <h:commandButton id="delete"
       value="Delete" action="#{researchHome.remove}"
       rendered="#{researchHome.managed}" /> <s:button propagation="end"
       id="done" value="Done" view="/researchList.xhtml" /></div>
      
       </h:form>
      
       </ui:define>
      
      </ui:composition>
      
      


      and the pages.xml

      <!DOCTYPE pages PUBLIC
       "-//JBoss/Seam Pages Configuration DTD 1.2//EN"
       "http://jboss.com/products/seam/pages-1.2.dtd">
      
      <pages no-conversation-view-id="/home.xhtml"
       login-view-id="/login.xhtml">
      
       <page view-id="*">
       <navigation>
       <rule if-outcome="home">
       <redirect view-id="/home.xhtml" />
       </rule>
       </navigation>
       </page>
      
       <page view-id="/addData.xhtml">
      
       <navigation from-action="#{researchManager.addDataFile}">
       <rule if-outcome="dataadded">
       <end-conversation />
       <redirect view-id="/research.xhtml">
       <param name="researchId"
       value="#{researchManager.research.id}" />
       </redirect>
       </rule>
       </navigation>
      
       </page>
      
      
       <page view-id="/research.xhtml">
      
       <navigation
       from-action="#{researchManager.removeData(research)}">
       <end-conversation />
       <redirect view-id="/research.xhtml">
       <param name="researchId"
       value="#{researchManager.research.id}" />
       </redirect>
       </navigation>
      
       <navigation
       from-action="#{researchManager.selectResearch(research)}">
       <redirect view-id="/addData.xhtml" />
       </navigation>
      
       </page>
      
      
       <exception
       class="org.jboss.seam.framework.EntityNotFoundException">
       <redirect view-id="/error.xhtml">
       <message>Not found</message>
       </redirect>
       </exception>
      
       <exception class="javax.persistence.EntityNotFoundException">
       <redirect view-id="/error.xhtml">
       <message>Not found</message>
       </redirect>
       </exception>
      
       <exception class="javax.persistence.OptimisticLockException">
       <end-conversation />
       <redirect view-id="/error.xhtml">
       <message>
       Another user changed the same data, please try again
       </message>
       </redirect>
       </exception>
      
       <exception class="org.jboss.seam.security.AuthorizationException">
       <redirect>
       <message>You don't have permission to do this</message>
       </redirect>
       </exception>
      
       <exception class="org.jboss.seam.security.NotLoggedInException">
       <redirect view-id="/login.xhtml">
       <message>Please log in first</message>
       </redirect>
       </exception>
      
       <exception>
       <redirect view-id="/error.xhtml">
       <message>Unexpected error, please try again</message>
       </redirect>
       </exception>
      
      </pages>
      



      best regards!
      michal przadka