[jboss-user] [JBoss Seam] - Re: OneToMany List refresh after insert
damianharvey
do-not-reply at jboss.com
Mon May 7 08:50:17 EDT 2007
I've recreated this with a simple example using Seam Gen. If you have a PERSON entity and a CITY entity. Then you wish to show a list of CITYs with a column holding a ui:repeat (or similar) displaying all associated PERSONs. The cause of the problem is that this is an "all-in-one" type page where the form to add the record is on the same page as the table to display. I suspect that something is needed to force the refresh.
The page:
| <!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:a="https://ajax4jsf.dev.java.net/ajax"
| xmlns:rich="http://richfaces.ajax4jsf.org/rich"
| template="layout/template.xhtml">
| <ui:define name="body">
| <h:messages globalOnly="true" styleClass="message" id="globalMessages"/>
| <h:form id="person" styleClass="edit">
| <rich:panel>
| <f:facet name="header">Create Person</f:facet>
| <s:decorate id="firstnameDecoration" template="layout/edit.xhtml">
| <ui:define name="label">Firstname</ui:define>
| <h:inputText id="firstname" value="#{personHome.instance.firstname}"/>
| </s:decorate>
| <s:decorate id="surnameDecoration" template="layout/edit.xhtml">
| <ui:define name="label">Surname</ui:define>
| <h:inputText id="surname" value="#{personHome.instance.surname}"/>
| </s:decorate>
| <s:decorate id="cityDecoration" template="layout/edit.xhtml">
| <ui:define name="label">City</ui:define>
| <h:selectOneMenu id="city" value="#{personHome.instance.city}" style="width:250px;">
| <s:selectItems value="#{cityList.resultList}" var="city"
| noSelectionLabel="Please Select..." label="#{city.cityname}"/>
| <s:convertEntity />
| </h:selectOneMenu>
| </s:decorate>
| <div style="clear:both">
| <span class="required">*</span>
| required fields
| </div>
| </rich:panel>
| <div class="actionButtons">
| <h:commandButton id="save" value="Save"
| action="#{personHome.persist}" rendered="#{!personHome.managed}"/>
| </div>
| </h:form>
| <rich:dataTable var="city" value="#{cityList.resultList}"
| rowClasses="rvgRowOne,rvgRowTwo" id="cityTable">
| <h:column>
| <f:facet name="header">City</f:facet>
| #{city.cityname}
| </h:column>
| <h:column>
| <f:facet name="header">people</f:facet>
| <ui:repeat var="person" value="#{city.persons}">
| <h:outputText value="#{person.firstname} #{person.surname}"/>
| <br/>
| </ui:repeat>
| </h:column>
| </rich:dataTable>
| </ui:define>
| </ui:composition>
|
The page has no pages.xml entries or associated page.xml file. The persist action returns to the current page. I would have thought that as the dataTable is re-rendered, that the List of Persons would be refreshed; however it isn't.
And I have changed the PersonHome object from what Seam generated to remove the PersonHome from the conversation so that the same page can be reused:
| package com.seamtest;
|
| import org.jboss.seam.annotations.In;
| import org.jboss.seam.annotations.Name;
| import org.jboss.seam.annotations.Transactional;
| import org.jboss.seam.contexts.Contexts;
| import org.jboss.seam.framework.EntityHome;
|
| @Name("personHome")
| public class PersonHome extends EntityHome<Person> {
|
| public void setPersonPersonid(Long id) {
| setId(id);
| }
|
| public Long getPersonPersonid() {
| return (Long) getId();
| }
|
| @Override
| protected Person createInstance() {
| Person person = new Person();
| return person;
| }
|
| public Person getDefinedInstance() {
| return isIdDefined() ? getInstance() : null;
| }
|
| @Override
| @Transactional
| public String persist() {
| String status = super.persist();
| Contexts.removeFromAllContexts("personHome");
| return status;
| }
|
| }
|
The Person entity is unchanged from Seam-Gen. It contains only firstname, surname and City. I have changed the City entity to store a java.util.List of Persons rather than a set:
| package com.seamtest;
| // Generated Apr 16, 2007 6:03:07 PM by Hibernate Tools 3.2.0.b9
|
| import java.util.ArrayList;
| import java.util.List;
|
| import javax.persistence.CascadeType;
| import javax.persistence.Column;
| import javax.persistence.Entity;
| import javax.persistence.FetchType;
| import javax.persistence.Id;
| import javax.persistence.JoinColumn;
| import javax.persistence.ManyToOne;
| import javax.persistence.OneToMany;
| import javax.persistence.Table;
|
| import org.hibernate.validator.NotNull;
|
| /**
| * City generated by hbm2java
| */
| @Entity
| @Table(name = "CITY", catalog = "SEAMTEST")
| public class City implements java.io.Serializable {
|
| private long cityid;
| private String cityname;
| // private Set<Person> persons = new HashSet<Person>(0);
| private List<Person> persons = new ArrayList<Person>(0);
|
| public City() {
| }
|
| public City(long cityid) {
| this.cityid = cityid;
| }
| public City(long cityid, String cityname,
| List<Person> persons) {
| this.cityid = cityid;
| this.cityname = cityname;
| this.persons = persons;
| }
|
| @Id
| @Column(name = "CITYID", unique = true, nullable = false)
| @NotNull
| public long getCityid() {
| return this.cityid;
| }
|
| public void setCityid(long cityid) {
| this.cityid = cityid;
| }
|
| @Column(name = "CITYNAME")
| public String getCityname() {
| return this.cityname;
| }
|
| public void setCityname(String cityname) {
| this.cityname = cityname;
| }
| @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "city")
| public List<Person> getPersons() {
| return this.persons;
| }
|
| public void setPersons(List<Person> persons) {
| this.persons = persons;
| }
|
| }
|
|
Happy to email a stripped down project if it would help.
Thanks,
Damian.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4043635#4043635
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4043635
More information about the jboss-user
mailing list