CRUD + RichFaces : Implementierung vom ScrollableDataTable

Tonteria

Grünschnabel
Hi,

ich habe ein Problem mit obiger RichFaces - Komponente.
Und zwar habe ich mir das so vorgestellt, dass durch die Parameter value="entityHandler.ObjektContainer" und selection="entityHandler.selectedObject" genau spezifiziert ist, dass bei Selektion einer Zeile ein bestimmtes Objekt aus dem Container genommen wird, an dem dann CRUD-Methoden zum Einsatz kommen können.
Anscheinend geht das nicht so einfach :

Der View

PHP:
            <rich:scrollableDataTable rowKeyVar="rkv" frozenColCount="0" height="400px" 
                width="700px" id="entityList" rows="40" columnClasses="col"
                value="#{entityList}" var="s_entity" sortMode="single" binding="#{table}"
selection="#{entityhandler.selection}"  rendered="#{identity.loggedIn}">
                

                <rich:column id="name">
                    <f:facet name="header"><h:outputText styleClass="headerText" value="Titel" /></f:facet>
                    <h:outputText value="#{s_entity.name}" />
                </rich:column>
                <rich:column id="topic">
                    <f:facet name="header"><h:outputText styleClass="headerText" value="Topic" /></f:facet>
                    <h:outputText value="#{s_entity.topic}" />
                </rich:column>
                
                <rich:column id="city">
                    <f:facet name="header"><h:outputText styleClass="headerText" value="City" /></f:facet>
                    <h:outputText value="#{s_entity.city}" />
                </rich:column>
                
                <rich:column id="author">
                    <f:facet name="header"><h:outputText styleClass="headerText" value="Author" /></f:facet>
                    <h:outputText value="#{s_entity.author}" />
                </rich:column>
                
                <rich:column id="content">
                    <f:facet name="header"><h:outputText styleClass="headerText" value="Content" /></f:facet>
                    <h:commandLink id="inhalt" action="#{entityhandler.loadentityData}">
					<f:param name="s_entityID" value="#{s_entity.id}" />
					<h:outputText value="Inhalt" />
					</h:commandLink>
                </rich:column>
            </rich:scrollableDataTable>
                <h:commandButton id="delete" value="Delete"
    action="#{entityhandler.delete}" />
    <f:param name="s_entityID" value="#{s_entity.id}" />
         </s:div>

und der EntityHandler :


PHP:
@Name("entityhandler")
@Stateful
@Scope(ScopeType.CONVERSATION)
public class entityHandlerImpl implements entityHandler{

@In (create=true, required=false)
private org.domain.entitysubmission.entity.User user;

@PersistenceContext (type = PersistenceContextType.EXTENDED, unitName="entitySubmission")
private EntityManager em;

@In
@Out
private FacesMessages facesMessages;

@DataModel
private List<org.domain.entitysubmission.entity.entity> entityList = new ArrayList<org.domain.entitysubmission.entity.entity>();

@DataModelSelection
private org.domain.entitysubmission.entity.entity selectedEntity;

@RequestParameter
private Long s_entityID;

@In(create=true)
@Out(required=false)
private org.domain.entitysubmission.entity.entity entity;

private SimpleSelection selection = new SimpleSelection();


private UIScrollableDataTable table;

public SimpleSelection getSelection() {
	return selection;
}



public void setSelection(SimpleSelection selection) {
	this.selection = selection;
}


public void persistentityData(){
    //set relationship
    this.entityt.setUser(this.user);
    this.user.getentityList().add(this.entity);
    //persist data, because 1:1 relation via merge of user
    em.merge(this.user);
    
    //information to user
    facesMessages.add("entity erfolgreich angelegt!");
    }



@Factory("entityList")
public void createentityList(){
this.entityList = em.createQuery("from entity order by topic").getResultList();
}

public void loadentityData(){
	this.entity = em.find(org.domain.entitysubmission.entity.entity.class, this.s_entityID);
	}

@Remove
@Destroy
public void destroy() {
	// TODO Auto-generated method stub
	
}

public void delete()

{	
   this.entity = em.find(org.domain.entitysubmission.entity.entity.class, this.s_entityID);
   this.user.getentityList().remove(this.entity);
   em.remove(this.entity);
   this.entity=null;
}

public String takeSelection() {
	selectedentitys = new ArrayList<entity>();
	Iterator<Object> iterator = getSelection().getKeys();
	while (iterator.hasNext()){
	Object key = iterator.next();
	table.setRowKey(key);
	if (table.isRowAvailable()) {
	getSelectedEntities().add((entity) table.getRowData());
	}
	}
	return null;
	}



public ArrayList<entity> getSelectedEntities() {
	return selectedEntities;
}



public void setSelectedEntities(ArrayList<entity> selectedEntities) {
	this.selectedEntities = selectedEntities;
}


}

Folgende Fehlermeldung kommt wenn ich den Delete-Button betätige, obwohl die Property offensichtlich existiert :

PHP:
/entityOverview.xhtml @21,75 selection="#{entityhandler.selection}": Property 'selection' not found on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_3

Wenn ich den View ändere und beim ScrollableDataTable als value="entityList" und als selection="selectedAbstract" angebe und dann den Delete-Button klicke kommt folgende exception :

PHP:
"#{entityhandler.delete}: javax.ejb.EJBTransactionRolledbackException: id to load is required for loading"

Offensichtlich wird also keine Entity selektiert :(

Ich erwarte nicht, dass jetzt jemand bei dem Wirrwarr durchsieht. ;) Was mich weiterbringen würde wäre ein aktuelles Tutorial wie man mit RichFaces (+Seam) eine CRUD-App implementiert, in der man innerhalb eines ScrollableDataTables selektieren kann. Hab gesucht, aber leider gar nichts aktuelles gefunden :confused: Es sollte schon ein scrollable sein, weil die Datenmenge groß wird und sortieren und selektieren erwünscht ist.

Edit : Was micht schon weiterbringen würde : Wie selektiert man im scrollableDataTable eine Entity ?

Beste Grüße,

Tonteria
 
Zuletzt bearbeitet:
Zurück