problems with refreshing view after entity change
przadka Aug 30, 2007 5:36 AMHello,
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