JSF: Entites in SelectItems und Converter

y0dA

Top Contributor
Ich entwickle nicht für Swing sondern JSF :).
Ich schreibe grad einen Konverter..
Wobei so ein Konverter, bei einem grossen Objekt (=viele Member) sicher auch nicht performant sein dürfte.

Also sollte ich nie mit einem "leeren" Objekt (nur ID gesetzt) speichern sondern das Objekt bei Bedarf "nachladen"?
 
M

maki

Gast
Ich entwickle nicht für Swing sondern JSF
Ach so... na dann ;)

Wobei so ein Konverter, bei einem grossen Objekt (=viele Member) sicher auch nicht performant sein dürfte.
Sollte kein Problem sein, musst ja nicht alles konvertieren, nur genug um das Objekt beim zurück-konvertieren wieder zusammensetzen bzw. finden zu können, würde aber nicht den (Zurück-)Converter über JPA das Objekt suchen lassen ;)
Ansosnten würde es problematisch werden wenn du wirklich alles konvertieren willst, man denke nur an m:n Beziehungen :autsch:

Also sollte ich nie mit einem "leeren" Objekt (nur ID gesetzt) speichern sondern das Objekt bei Bedarf "nachladen"?
Ja & kommt darauf an.
Man muss ja nicht immer den EntityManager bemühen, wenn man eine Referenz in einer Map oder ähnlichem ablegen kann.
 

y0dA

Top Contributor
Ach so... na dann ;)


Sollte kein Problem sein, musst ja nicht alles konvertieren, nur genug um das Objekt beim zurück-konvertieren wieder zusammensetzen bzw. finden zu können, würde aber nicht den (Zurück-)Converter über JPA das Objekt suchen lassen ;)
Ansosnten würde es problematisch werden wenn du wirklich alles konvertieren willst, man denke nur an m:n Beziehungen :autsch:


Ja & kommt darauf an.
Man muss ja nicht immer den EntityManager bemühen, wenn man eine Referenz in einer Map oder ähnlichem ablegen kann.

Hast du mir nicht gerade gesagt dass man das Objekt als ganzes setzen soll? Nun schreibst du man muss ja nicht alles konvertieren :) - in meinem Fall handelt es sich eh um sehr kleine Objekte (2 Member). Aber grundsätzlich widersprichst du dich hier? Wie meinst du das mit dem "finden"? wie/woe kann ich die Objekte in der Session finden? Dachte ich mache mit meinem Entitymanager persists und finds und danach hab ich das Objekt und ausserhalb der Transaktion sind selbige dann eh dirty. Ich hoffe mal dass sich der OR Mapper die Dinger nicht sonst noch wo merkt - wie gesagt ich darf nicht viel Speicher benutzen :D

Deinen 2ten Satz verstehe ich leider nicht so ganz. Map? Wenn ich was speichern/laden will dann muss ich das doch über den Entitymanager machen?

**EDIT**
Mein Converter ist enttäuscht :( :
Java:
Caused by: javax.faces.convert.ConverterException
	at at.gv.brz.zwr.web.util.WaffenmarkeConverter.getAsString(WaffenmarkeConverter.java:49)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:648)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(HtmlRendererUtils.java:362)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:337)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderListbox(HtmlRendererUtils.java:277)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlListboxRendererBase.encodeEnd(HtmlListboxRendererBase.java:58)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
	... 42 more

Der Parameter "value" ist null:
Java:
	public String getAsString(FacesContext ctx, UIComponent uiComponent,
			Object value) throws ConverterException {
		if (!(value instanceof Waffenmarke))
			throw new ConverterException();

		Waffenmarke waffenmarke = (Waffenmarke) value;
		StringBuffer sb = new StringBuffer();
		sb.append(PROP_ID);
		sb.append("=");
		sb.append(waffenmarke.getId());
		sb.append(",");
		sb.append(PROP_BEZ);
		sb.append("=");
		sb.append(waffenmarke.getBezeichnung());

		return sb.toString();
	}
faces:
Java:
<converter>
	<converter-id>waffenmarkeConverter</converter-id>
	<converter-class>at.gv.brz.zwr.web.util.WaffenmarkeConverter</converter-class>
</converter>

xhtml:
Java:
					<h:outputLabel for="marke" value="#{msg.waffe_marke}" />
					<h:selectOneListbox size="1" id="marke" value="#{waffeController.waffenmarke}">
						<f:selectItems value="#{utilWebController.waffenmarkenForSelect}" />
						<f:converter converterId="waffenmarkeConverter"></f:converter>
					</h:selectOneListbox>

SelectItem Liste:
Java:
	public List<SelectItem> getWaffenmarkenForSelect() {
		if (waffenmarkenForSelect == null) {
			List<Waffenmarke> waffenmarken = waffenmarkeService.loadAll();
			waffenmarkenForSelect = new ArrayList<SelectItem>(waffenmarken
					.size());

			for (Waffenmarke waffenmarke : waffenmarken) {
				waffenmarkenForSelect.add(new SelectItem(waffenmarke,
						waffenmarke.getBezeichnung()));
				// waffenmarkenForSelect.add(new
				// SelectItem(String.valueOf(waffenmarke.getId()),
				// waffenmarke.getBezeichnung()));
			}
		}

		return waffenmarkenForSelect;
	}
 
Zuletzt bearbeitet:
M

maki

Gast
Hast du mir nicht gerade gesagt dass man das Objekt als ganzes setzen soll?
Bitte den Kontext berücksichtigen, JPA vs. JSF, da liegen Welten dazwischen, JSF Fragen sind zB. auch im Unterforum "Datenbankprogrammierung" eine Themaverfehlung, deine Chancen auf bessere Antworten steigen im richtigen Unterforum.

Ich hab meine Erfahrungen mit JSF 1.1 gemacht, und hab sie alle wieder verdrängt, so schrecklich war die 1.1 Version... :shock:

Nebenbei, solltest dich auf eine Sache konzentrieren, JPA und JSF gleichzeitig zu erlernen garantiert Frust, und zwar viel davon.
 
M

maki

Gast
HAHA!!!!!
Diese Kommunikation führten wir beide schon mal (bezüglich Converter):
myFaces - SelectItem
Hehe.. im März 2008 waren meine Erfahrung mit JSF noch frisch...

So wie es aussieht sollte ich mal die hashcode und equals Methode überschreiben.
Das auf jedenfall, deswegen auch meine Frage danach in Post #6.
Tue dirselber einen gefallen und nutze nicht die ID in equals..
 

y0dA

Top Contributor
Kannst du meinen Thread in das "richtige" Unterforum verschieben?

Du meinst ich soll die ID aus dem equals rauslassen? Dann kommts nur mehr auf "bezeichnung" an :)

Argh
Also das überschreiben der beiden Methoden hat nichts gebracht - der Converter wird zuerst aufgerufen und bei "getAsString" ist der Parameter null.. Warum ist der null, habe ich hier was falsch gemacht:
Java:
					<h:outputLabel for="marke" value="#{msg.waffe_marke}" />
					<h:selectOneListbox size="1" id="marke" value="#{waffeController.waffenmarke}">
						<f:selectItems value="#{utilWebController.waffenmarkenForSelect}" />
						<f:converter converterId="waffenmarkeConverter"></f:converter>
					</h:selectOneListbox>

**EDIT**
Werfe nun keine ConverterException mehr - anscheinend ist beim ersten Aufruf der Parameter immer null, danach kommen dann die korrekten Werte-warum auch immer (stand eigentlich eh auch schon in unsrem alten Thread).
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben