Title: omsCube
1omsCube
- Objektverwaltung, basierend auf einem
relationalen Datenbankmanagementsystem
2Wichtigkeit von Persistenz
- Persistenz ist eine der wichtigsten
Funktionalitäten in Businessanwendungen - In vielen Anwendungen bilden die
Datenbankoperationen einen großen Teil des
Sourcecodes - Die Daten werden länger genutzt als die
Anwendungen, die die Daten erzeugt haben - Performance von Datenbankoperationen hat
entscheidende Rolle in der Anwendungsperformance
3Persistenz-Lösungen
- RDBMS relational database management systems
- Problem object-relational impedance mismatch
- ODBMS object database management systems
- ORDBMS object/relational database management
systems - Andere Lösungen
- flat files, XML, in memory
4omsCube E/R Diagramm
5omsCube Metadaten
6omsCube Daten
7stored procedures - Beispiel
- ...
- FUNCTION createElement( p_displayName IN
VARCHAR2, p_bookmark IN VARCHAR2, p_scm_Id IN
NUMBER, p_creating_elm_Id IN NUMBER - ) RETURN NUMBER
- FUNCTION updateElement( p_elm_Id IN NUMBER,
p_displayName IN VARCHAR2, p_bookmark IN
VARCHAR2, p_modifying_elm_Id IN NUMBER - ) RETURN NUMBER
- FUNCTION cloneElementAppend( p_elm_Id IN NUMBER,
p_target_elm_id IN NUMBER, p_target_cat_id IN
NUMBER, p_target_key IN VARCHAR, p_recursive IN
NUMBER, p_cloneAssociations IN NUMBER,
p_creating_elm_Id IN NUMBER - ) RETURN NUMBER
- FUNCTION removeElementRecursive( p_elm_Id IN
NUMBER, includeSelf IN NUMBER, removeAssociations
IN NUMBER - ) RETURN NUMBER
- PROCEDURE moveCompositionBefore( p_cmp_Id in
number, p_before_cmp_Id IN NUMBER,
p_modifying_elm_Id in number ) - ...
8stored procedures - packages
- PCK_AUTHORISATION
- PCK_COMPOSITIONPATH
- PCK_ELEMENT
- PCK_EXCEPTION
- PCK_LOCKING
- PCK_META
- PCK_NAMESPACEPATH
- PCK_RELATION
- PCK_VALIDATOR
9Architektur
10omsCube core Klassen
11omsCube core API
12Anfragebeispiel
- DECLARE
- v_bookmark element.elm_bookmarkTYPE
- v_id element.elm_idTYPE
- v_ids t_array
- BEGIN
- v_bookmark in_string_bookmark
- BEGIN
- select elm_id into v_id from element where
elm_bookmark v_bookmark - EXCEPTION
- when NO_DATA_FOUND then v_id 0
- END
- SELECT ass_target_elm_id BULK COLLECT INTO v_ids
- FROM association
- WHERE ass_cat_id in_int_members_att_id
- AND ass_source_elm_id v_id
-
- OPEN out_cursor_tree FOR
13DAO und Entities
14Beispiel generierte Klassen 1/2
15Beispiel generierte Klassen 2/2
Finders
Entities
16OmsManager
17Beispiel Benutzerverwaltung
18Beispiel Loginprozedur 1/3
- Profile getProfile( String username, String
password ) -
- DataStore store Context.getDataStore()
- ProfileFinder finder new ProfileFinder( store
) - Profile profile
- finder.findProfileWithRolesByLogin( username )
- store.commit()
- password MD5.getHashString( password )
- if( profile null
- !profile.getPassword().equalsIgnoreCase(
password ) ) -
- return null
-
- return profile
-
19Beispiel Loginprozedur 2/3
- public Profile findProfileWithRolesByLogin(
String loginName ) throws Exception -
- Scheme profileScm getMetaData().getScheme(
Profile.NAMESPACE_PATH, - Profile.SCHEME_NAME )
- BoundVariable bindVariables new
BoundVariable -
- new BoundVariable( "out_cursor_tree", null ),
- new BoundVariable( "in_string_username",
loginName ), - new BoundVariable( "in_int_username_att_id",
profileScm.getSimpleAttributeByName(
Profile.SAT_USERNAME ).getId() ), - new BoundVariable( "in_int_roles_att_id",
profileScm.getComplexAttributeByName(
Profile.CAT_ROLES ).getId() ), -
- OMSStructure tree getStructureByResource(
ProfileFinder.class, "findProfileWithRolesB
yLogin.sql", null, bindVariables ) - OMSElement elements tree.getElements()
- for (int i 0 elements ! null i lt
elements.length i) - if( elements i .getNamespacePath().equals(
Profile.NAMESPACE_PATH ) elements i
.getSchemeName().equals( Profile.SCHEME_NAME ) ) -
- return new Profile( elements i )
-
- return null
20Beispiel Loginprozedur 3/3
- DECLARE
- v_count INTEGER
- v_roles_count INTEGER
- v_profile_id element.elm_idTYPE
- v_roles_cat_id complexattribute.cat_idTYPE
- v_cur SYS_REFCURSOR
- BEGIN
- v_roles_cat_id in_int_roles_att_id
- SELECT MAX( uvl_elm_id ) into v_profile_id
- FROM uniquevalue
- WHERE uvl_sat_id in_int_username_att_id
- AND uvl_value in_string_username
- IF v_profile_id IS NOT NULL THEN
- SELECT count() INTO v_roles_count FROM
association - WHERE ass_cat_id v_roles_cat_id
- AND ass_source_elm_id v_profile_id
-
SELECT FROM association JOIN element ON (
elm_id ass_target_elm_id OR elm_id
v_profile_id ) LEFT OUTER JOIN simplevalue ON
svl_elm_id elm_id LEFT OUTER JOIN clobvalue ON
cvl_elm_id elm_id LEFT OUTER JOIN blobvalue ON
bvl_elm_id elm_id LEFT OUTER JOIN uniquevalue
ON uvl_elm_id elm_id WHERE ( ass_cat_id
v_roles_cat_id AND ass_source_elm_id
v_profile_id )
SELECT FROM ELEMENT LEFT OUTER JOIN simplevalue
ON svl_elm_id elm_id LEFT OUTER JOIN clobvalue
ON cvl_elm_id elm_id LEFT OUTER JOIN blobvalue
ON bvl_elm_id elm_id LEFT OUTER JOIN
uniquevalue ON uvl_elm_id elm_id WHERE elm_id
v_profile_id
21omsCube Rechte
22omsCube Locking
23Vorteile
- Direkte Abbildung von Businessklassen in der
Datenbank - Leichte Erweiterbarkeit des logischen
Datenbankschemas - Gute Ablage von Baumstrukturen
- Gut für Speicherung von vielen unterschiedlichen
Objekten geeignet - Gute Performance von Suchoperationen
- Alle Objekte sind auf die selbe Weise in der
Datenbank gespeichert - Nutzt oft bereits vorhandene und gut bekannte
relationale Datenbanken als Basis - Kann mit relationalen Modellen kombiniert werden
24Nachteile
- Komplizierte Abfragen
- Anwendungslogik-Klassen sind von der
Datenbankschicht abhängig - Schlechte Unterstützung für verschiedene
Datenbanken - Numerische- und Datums-Werte sind als VARCHAR
gespeichert - Schlechtere Performance von Schreiboperationen
- Die Technologie ist nicht weit verbreitet
25Fazit
- Wähle immer die Technologie, die am besten Deinen
Anforderungen und Bedürfnissen entspricht - There is no silver bullet
26Kontakt
- FINGO www.fingo.pl
- Robert Marek robert_at_fingo.pl
- Präsentationsfolien www.fingo.info/omscube/
- omsCube offizielle Seite www.opencube.org
- openCube Verein info_at_opencube.org