Google+
JPA Support
English
Deutsch

JPA Support ist ein Module für die Unterstützung von Hibernate in Zusammenarbeit mit JSF, insbesondere mit JSF Ext.

Features#

Im wesentlichen sind folgende Features enthalten:
  • Enum-Liste: Mit den Datentypen EnumListType und EnumSetType können Enum-Sets in eine einfache Datenbank-Spalte geschrieben werden. Damit wird der Umstand behoben, für jede Enum-Liste eine eigene Tabelle anlegen zu müssen. Über die Enum-List gibt es eine Set-Variante deshalb, weil die List-Variante im Zusammenhang mit der Persistenz zu Problemen führt. Diese werden durch das Set gelöst.
  • HibernateDynamicList: Eine dynamische Liste für den Gebrauch von Tables von JSF, Primefaces, Richfaces und weiteren. Die Liste vereinfacht das Datenbank gestützte Paging und Filtering, indem die gewünschte Tabelle einfach als DetachedCriteria übergeben wird. Adaptoren für Primefaces oder Richfaces ermöglichen den direkten Einsatz in den Tables.
  • LongType: Eine Basis auf Long-Datenbankspalten, um einfach Datentypen zu implementieren.
  • StringType: Eine Basis auf String-Datenbankspalten, um einfach Datentypen zu implementieren.

Dynamische Daten#

Viele Web-Oberflächen einschließlich Primefaces oder Richfaces liefern Listen, Trees und andere Darstellungen, die ein dynamisches Befüllen erlauben. Es werden von der Datenbank immer nur die gerade benötigte Anzahl von Datensätzen geholt. Durch Steuerelemente wie Pager oder Tree-Expansion werden dann Elemente nachgeladen.

Wieso werden solche Elemente nicht öfters eingesetzt? Die Hemmschwelle sitzt im Anbinden der Datenbank. JPA Support enthält Interfaces und Implementierungen, um den wiederholten Code zu kapseln.

Dynamic List#

Das Interface DynamicList<T> ist die Grundlage für die Anbindung von dynamischen Daten. In JPA Support werden dabei die Implementierung mitgeliefert: HibernateDynamicList und RevisionDynamicList:
  • HibernateDynamicList: Die wohl meist gebrauchte Implementierung. Diese nimmt im Konstruktor eine DetachedCriteria und eine Class als zugehörigen Ergebnistyp.
  • RevisionDynamicList: Nur für die Verwendung von Envers sinnvoll. Nimmt Class, Serializable id und List<Number> revisions als Parameter. Damit können Revisionen aufgelistet werden, die Envers transparent anlegt.

Dynamic List Wrapper#

In einigen Fällen reicht das einfache Durchreichen der Datensätze nicht aus. Dafür gibt es die Klasse DynamicListWrapper. Diese Klasse nimmt eine andere DynamicList als Parameter und wrappt jedes Ergebnis-Element in eine neue Klasse, indem die Methode list(...) überschrieben wird:
	@Override
	public List<ProcessStats> list(int first, Integer pageSize, String sortField, Boolean sortOrder,
			Map<String, Object> filters) {
		Processor processor = Context.getContext().getBean(Processor.class);
		List<ProcessStats> list = new ArrayList<>();
		for (Process process : getWrapped().list(first, pageSize, sortField, sortOrder, filters)) {
			long transactionCount = processor.getTransactionCount(user, process, false);
			ProcessStats stats = new ProcessStats(process, transactionCount);
			list.add(stats);
		}
		return list;
	}

Frontend#

Wie kommen die Daten nun ins Frontend? Bei Primefaces kann dies so aussehen:
<p:dataTable value="#{processList.list}" var="process" lazy="true">
    <p:column>
        <h:outputText value="#{process.value}"/>
    </p:column>
</p:dataTable>

Die dazugehörige Bean:

	private PrimefacesDataModel<Process> list;
	
	public PrimefacesDataModel<Process> getList() {
		if (list == null) {
		        DetachedCriteria criteria = DetachedCriteria.forClass(Process.class);
			list = new PrimefacesDataModel<>(new HibernateDynamicList<>(criteria, Process.class));
		}
		return list;
	}

Die HibernateDynamicList kann natürlich auch an anderer Stelle verwendet werden, als diese direkt in PrimefacesDataModel oder RichfacesDataModel zu kapseln.

Hibernate Helper#

Mit dieser Klasse können einige Hibernate-Funktionen genutzt werden, die sonst umständlicher sind oder nur intern zur Verfügung stehen.

MethodeBeschreibung
saveAndRefreshDie Methode speichert eine Entity und läd die Daten neu aus der Datenbank. Der Sinn darin ist, Werte zu aktualisieren, die durch die Datenbank erzeugt wurden. Dies ist dann nützlich, wenn Datenbankskripte, Trigger und Sequenzgeneratoren verwendet werden.
listListet eine Detached Criteria.
Merged SaveDie Methode save führt einen Save-Or-Update durch, indem ein Merge bei Bedarf durchgeführt wird und anschließend Save bzw. Update ausgeführt wird.
uniqueResultLiefer ein Unique Result für eine Detached Criteria.
makeExecutableMacht eine Detached Criteria ausführbar.
getPersisterErmöglicht den Zugriff auf den Hibernate Persister für ein Entity-Objekt oder eine Entity-Klasse.
getModifiedGibt eine Map zurück, welche Felder einer Entity modifiziert wurden.
getDatabaseSnapshotGibt den Database Snapshot einer Entity zurück. Es kann sich entweder um einen Cached Snapshot handeln oder es wird ein solcher erstellt.
getIdLiefert die Id zu einem Entity.

Tree Nodes#

Die Klasse com.intersult.jpa.primefaces.BaseTreeNode ist eine abstrakte Implementierung einer Primefaces Treenode. Die Klasse ist vorbereitet, um Daten dynamisch zu erzeugen. Beispielsweise also über die DynamicList aus der Datenbank laden zu können.
public class CompareTreeNode extends BaseTreeNode {
        [...]

	@Override
	protected void createChildren() {
		if (childMap != null)
			getChildren().addAll(childMap.values());
	}
}

Neuen Anhang hinzufügen

Du bist nicht autorisiert, Anhänge zu dieser Seite hochzuladen.
« Diese Seite (Version-4) wurde zuletzt am 30-Apr-2015 15:23 von Dieter Käppel geändert.