26
1 Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] Persistenz mit Hibernate 2 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate ) Akademie ) ) Beratung ) „Orientierung“ in Objekten Schulungen, Coaching, Weiterbildungsberatung, Train & Solve-Programme Methoden, Standards und Tools für die Entwicklung von offenen, unternehmens- weiten Systemen Schlüsselfertige Realisierung von Software Unterstützung laufender Projekte Pilot- und Migrationsprojekte ) Projekte )

Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

1

Orientation in Objects GmbH

Weinheimer Str. 6868309 Mannheim

[email protected]

Persistenz mitHibernate

2

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

) Akademie ) ) Beratung )

„Orientierung“ in Objekten

• Schulungen, Coaching, Weiterbildungsberatung, Train & Solve-Programme

• Methoden, Standards und Tools für die Entwicklung von offenen, unternehmens- weiten Systemen

• Schlüsselfertige Realisierung von Software• Unterstützung laufender Projekte• Pilot- und Migrationsprojekte

) Projekte )

Page 2: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

2

3

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Ihre Speaker

Serge Ndong<[email protected]>

Tobias Kieninger<[email protected]>

4

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Gliederung

• Hibernate?• HelloHibernateWorld• Leightweight J2EE• Heute und Morgen

Page 3: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

3

5

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Technologien zur Persistenz mit RDBMS

ObjektorientierteSicht

RelationaleSicht

JDBC

JDO

EJB

Hibernate

6

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Was ist Hibernate?

• „Einfaches“ Persistenz-Framework– Arbeitet mit Reflection und CGLIB (Code Generation Library)

• Anwendung sowohl in managed als auch non-managedUmgebungen

• Unterstützt viele Datenbanken mit JDBC-Treibern– DB2, PostgreSQL, MySQL, Oracle, Sybase, MS SQL Server,– SAP DB, Informatix, HypersonicSQL, Ingres, Progress, MCKoiSQL,– Oracle, MSSQL, Interbase, Pointbase, Frontbase, Firebird

Page 4: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

4

7

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Lizenz und aktuelle Versionen

• URL: http://www.hibernate.org

• Versionen:– 3.0 (seit 31.03.2005)– 3.0.3 (Maintenance Relases)

• Open-Source– Lizenziert unter LGPL– Kostenlos für Entwicklung und Betrieb

• Wird inzwischen bei JBoss entwickelt

8

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Java Virtual Machine

Wie funktioniert Hibernate?

*.classJava Compiler

Hibernate

DB hibernate.cfg.xml

*.hbm.xml

Page 5: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

5

9

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Features (Auszug)

• Transparente Persistenz (POJOs)

• Automatisches Dirty Checking

• Transitive Persistenz

• Lazy Fetching

• Mappingstrategien für Vererbung

POPOs (Plain Old Persistent Object)

10

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Gliederung

• Hibernate?• HelloHibernateWorld• Leightweight J2EE• Heute und Morgen

Page 6: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

6

11

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Java Klasse - POJO

public class User {

private Long id;

private String firstName;

private Set addresses = new HashSet();

....

public User() {}

public User(String firstName, String lastName,...) {...}

public Long getId() { return id;}

private void setId(Long id) {

this.id = id;

}

... //Getter, Setter und Business Methoden

}

12

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

HelloHibernateWorld

// Konfiguration

Configuration cfg = new Configuration();

SessionFactory factory = cfg.buildSessionFactory();

// Verbindungsaufbau

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

// Business Logik

User user=new User("Wade","Abdoulaye",“[email protected]");

session.save(user);

tx.commit();

session.close();

Page 7: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

7

13

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Konfigurationsdatei hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE ...>

<hibernate-configuration>

<session-factory>

<property name="hibernate.connection.driver_class">

.hsqldb.jdbcDriver

</property>

<property name="hibernate.connection.url">

:hsqldb:hsql://localhost/

</property>

<property name="hibernate.connection.username“>

sa

</property>

<property name="hibernate.connection.password“/>

14

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Konfigurationsdatei hibernate.cfg.xml

<property name="dialect">

.hibernate.dialect.HSQLDialect

</property>

<property name="show_sql">true</property>

...

<mapping resource="de/oio/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Page 8: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

8

15

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Mapping - User.hbm.xml

<?xml version="1.0"?>

<hibernate-mapping>

<class name="de.oio.User" table="user">

<id name="id" column="USER_ID" type="long">

<generator class="increment"/>

</id>

<property name="firstName" column="VORNAME"/>

<property name="lastName" column="NACHNAME"/>

<property name="email" column="EMAIL" type="string"/>

<set name="addresses">

<key column="user_id"/>

<one-to-many class="de.oio.Address"/>

</set>

</class>

</hibernate-mapping>

16

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Ablage der Mapping-Dateien

• Programmatisch hinzufügenConfiguration cfg = new Configuration()

cfg.addClass(de.oio.User.class);

oder

cfg.addRessource("de/oio/User.hbm.xml");

• In Konfiguration hinzufügen– <mapping resource="de/oio/User.hbm.xml"/>

Project.hbm.xml

User

AddressAddress

Address

User.hbm.xmlUser

AddressAddress

AddressAddress.hbm.xml

Page 9: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

9

17

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Hibernate API in einem Schichtenmodell

Business Layer

Persistence Layer

Session Transaction Query

SessionFactory

Configuration

Interceptor

UserType

JNDI JDBC JTA

18

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Objektszustände

Transient

Detached

Persistent

new

garbage

garbage

delete()save()

saveOrUpdate()

update()saveOrUpdate()lock()

evict()close()*clear()*

* gilt für alle Objekten in der Session

get()load()find()iterate()etc.

Page 10: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

10

19

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

HQL - Hibernate Query Language

• SQL-Funktionen– Aufruf von SQL-Funktionen (sysdate, upper, ...)– Für manche Dialekte

• Aggregation– count(), min(), max(), sum(), avg()

• Gruppierungen– group by– having

• Report Queries– SQL ist am schnellsten– Bei Report Queries kein Caching, kein Overhead– Sehr schnell

20

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

HQL - Hibernate Query Language

• Hibernate Query Language (HQL)– Objektorientierter Dialekt von ANSI SQL– Klassen und Eigenschaften statt Tabellen und Spalten– Unterstützt Polimorphismus– Viele SQL Funktionen(Joins, Projektionen, Aggregation...)

Query query = session.createQuery(„from User u whereu.firstName = :fname order by u.name asc“);

q.setString("fname", “abdoulaye");

List result = q.list();

Page 11: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

11

21

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

HQL - Aggregationen

• Zusammenfassung von Daten und Fakten• Bsp Minimum, Maximum etc...

Integer count =

(Integer) session.createQuery(

"select count(*) from User").uniqueResult();

List results = session.createQuery(

"select user.name, count(user), avg(user.logins)

from User user where user.status > 1

group by user.name").list();

22

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

HQL - Verschiedene Query Strategien

• Eager fetching im HQL-Query• Asoziierte Objekte werden automatisch befüllt

User user = session.createQuery(

“from User u left join fetch user.addresses

where user.id = 5”);

//assoziation ist schon nachgeladen

user.getAdresses().iterator();

Page 12: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

12

23

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Queries by Criteria (QBC) API

• Queries by Criteria (QBC) API– Queries werden objektorientiert zusammengebaut– Enthält Query by Example

Criteria criteria = session.createCriteria(User.class);

criteria.add(Expression.like(„firstname“, „abdoulaye“));

List result = criteria.list();

User exampleUser = new User();

exampleUser.setFirstname(„abdoulaye“);

Criteria criteria = session.createCriteria(User.class);

criteria.add(Example.create(exampleUser));

List result = criteria.list();

24

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Practice - Dynamische Queries

...

if (firstname != null) {

queryString.append(„lower(u.firstname) like :fname “);

conditionFound=true;

}

if (lastname != null) {

if (conditionFound) queryString.append("and ");

queryString.append("lower(u.lastname) like :lname ");

conditionFound=true;

}

...

if (firstname != null)

query.setString("fname", '%‘ + fn.toLowerCase() + '%');

...

Page 13: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

13

25

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Better Practice - Dynamische Queries mit Criteria API

Criteria crit = getSession().createCriteria(User.class);

if (firstname != null) {

crit.add( Expression.ilike("firstname", firstname,

MatchMode.ANYWHERE) );

}

if (lastname != null) {

crit.add( Expression.ilike("lastname", lastname,

MatchMode.ANYWHERE) );

}

26

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Best Practice - Dynamische Queries mit Query By Example

User u = new User;

u.setFirstname(“abdoulaye");

Example exampleUser = Example.create(u)

.ignoreCase()

.enableLike(MatchMode.ANYWHERE);

list = getSession().createCriteria(User.class)

.add(exampleUser)

.list();

Page 14: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

14

27

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Gliederung

• Hibernate?• HelloHibernateWorld• Leightweight J2EE• Heute und Morgen

28

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Request

Beispiel Architektur

Servlet Action / Business LogikRequest

DB

JSPResponse

Hibernate

Page 15: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

15

29

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Zugriff auf SessionFactory im Webumfeld

• Problem: Nur eine Instanz der SessionFactory

• Möglichkeiten– Application Context– JNDI– Singleton– ThreadLocal

• Empfehlung– Implementierung in HibernateUtil.java je Architektur

30

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

ThreadLocal-Pattern

• ThreadLocal-Pattern– Eine Session wird mit einem Request assoziert– Gemeinsamer Persitenz Kontext

• ThreadLocal– ThreadLocal Variable bietet Kopie an jedem Thread der ihn benutzt– Thread sieht nur Variablen die mit ihm assoziiert sind– Kein Zugriff auf die anderen Variablen

Page 16: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

16

31

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Request

ThreadLocal Beispiel Architektur

JSP

Servlet Action / Business LogikRequest

ResponseFilter

DB

beginTransaction()

commitTransaction() / closeSession()

Hibernate

32

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Implementierung ThreadLocal-Pattern

public class HibernateUtil {

private static final ThreadLocal threadSession

= new ThreadLocal();

public static Session getSession() {

Session s = (Session) threadSession.get();

if (s == null) {

s = sessionFactory.openSession();

threadSession.set(s);

}

return s;

}

public static Session beginTransaction() { ... }

}

Page 17: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

17

33

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Sessions schliessen

• Schliessen aller Sessions in ServletFilter

public void doFilter(...) throws ... {

try {

chain.doFilter(request, response);

HibernateUtil.commitTransaction();

}

catch(Exception e) { ... }

finally {

HibernateUtil.closeSession();

}

}

34

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Request

Verwendung eines DAOs (Data Access Object )

JSP

Servlet Action / Business LogikRequest

DB

Hibernate

DAO

commitTransaction() / closeSession()ResponseFilter

Page 18: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

18

35

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Implementierung Data Access Object

public class UserDAO {

public UserDAO() {

HibernateUtil.beginTransaction();

}

public User getUserById(Long userId) {

Session session = HibernateUtil.getSession();

User user = null;

...

user = (User) session.load(User.class, userId);

...

return user;

}

}

36

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

EJB-Container Hibernate

JNDI

SessionFactory

TransactionManager

ResourceManager DB

Managed Environment

• Features von Container nutzbar durch JCA (J2EE ConnectorArchitecture)– Externes Transactionmanagement (JTA)– Externes Connectionmanagement

Page 19: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

19

37

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Hibernate im Application Server - Unterschiede

• SessionFactory wird in JDNI abgelegt– Wird automatisch an JNDI gebunden– Konfiguration mittels hibernate.cfg.xml

static {

new Configuration().configure()

.buildSessionFactory();

...

}

public static SessionFactory getSessionFactory() {

Context ctx = new InitialContext();

String jndiName = "java:hibernate/HibernateFactory";

return (SessionFactory) ctx.lookup(jndiName);

}

38

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

EJB-Container

Session Facade

Web

DB

SB

SB

SB

SB

Client

Web

Hibernate

DAO

DAO

DAO

Page 20: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

20

39

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

EJB-Container

Braucht Hibernate Data Transfer Objects?

• Value Objects (VO) bzw. Data Transfer Objects (DTO)• Datenkontainer ohne Logik• Eventuell Value Object Assembler der Value Objects behandelt• Entkopplung vom Objektmodell

JDOJDOBusiness ObjClient DB

TO

JDOJDO

VOVOTO TO

TO

VOVOTO TO

40

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Anwendung von Detached Objects

• Objekte, ganze Teilbäume können aus Session entfernt werden• Verlieren Identität nicht• Können wieder persistent gemacht werden

EJB-Container

JDOJDOBusiness ObjClient DB

JDOJDO

DO

VOVODO DO

DODO

Page 21: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

21

41

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Detaching von Objekten - Beispiel

...

Session session1 = sf.openSession();Transaction tx1 = session.beginTransaction();

User user = (User) session.get(User.class, userId);tx.commit();

session.close();

...

user.setPassword(„secret“);

Session session2 = sf.openSession();

Transaction tx2 = session2.beginTransaction();

session2.update(user); // session2.saveOrUpdate(user);

tx2.commit();

...

42

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

DTO - Data Transfer Objects

• Vorteile– Flacht die Sicht auf stark hierarchisches Domain Model ab– Bereitet Daten für View-Komponenten auf

• Nachteile– Es erfolgt Duplizierung der Daten– Erweiterung des Modells muss in DTOs nachgezogen werden– Versionierung, Überspielen der Daten schwierig

Page 22: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

22

43

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Gliederung

• Hibernate?• HelloHibernateWorld• Leightweight J2EE• Heute und Morgen

44

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Standards und zukünftige Persistenz-Standards

JDO 1.0 JDO 2.0

EJB 2.0

EJB 3.0

EJB 2.1

Release

Working draft

Hibernate 2.x Hibernate 3

beeinflusst implementiert WD

JSR 220

JSR 243JSR 12

Page 23: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

23

45

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Annotations

• Metainformationen können in Java-Klasse abgelegt werden• Verfügbar ab Java 1.5• Stehen in der Bytecode(.class) und• Auch zur Laufzeit zur Verfügung

...

@Entity(access = AccessType.FIELD)

public class User implements Serializable {

...

46

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Annotation Entity Bean

@Entity(access = AccessType.FIELD)

public class User implements Serializable {

@Id;

Long id;

String firstName;

String lastName;

Date birthday;

@Transient Integer age;

.....

// Getter/setter und business Methoden

}

Page 24: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

24

47

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Gossip

• Versant sponsort VOA (Versant Open Access) als EclipseSubproject

• Oracle will eigenes Eclipse EJB3 Subproject unterstützen

• Viele Unterstellungen im Persistenzkrieg

48

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

Fazit / Ausblick

• EJB 3 vielversprechend

• Open Source Markt wird angereichert

• Hibernate starke Stabilität und hohe Popularität

Page 25: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

25

Orientation in Objects GmbH

Weinheimer Str. 6868309 Mannheim

[email protected]

Vielen Dank für IhreAufmerksamkeit !

Orientation in Objects GmbH

Weinheimer Str. 6868309 Mannheim

[email protected]

? ?

???

Fragen ?

Page 26: Persistenz mit Hibernate - OIO · 3 5 © 2005 Orientation in Objects GmbH Persistenz mit Hibernate Technologien zur Persistenz mit RDBMS Objektorientierte Sicht Relationale Sicht

26

51

© 2005 Orientation in Objects GmbHPersistenz mit Hibernate

„OIO-JAX Scrabble“ Gewinnspiel

• Spielen Sie mit uns eine Runde OIO-JAX Scrabble und gewinnenSie ein OIO Seminar aus dem Bereich

• „Scrabble-Felder“ bekommen Sie an unserem Konferenzstand.• Abgabe bis Donnerstag, 12.05.05 - 11.45 Uhr

• Gewinnbekanntgabe: 12.05.05 - 14.10 Uhr

• Wir freuen uns über Ihren Besuch.Viel Spass beim Scrabbeln!

UUUUEEEE

CCCCOOOOSSSS

NNNNEEEE

PPPPRRRROOOO

OOOOIIII

XXXXJJJJ AAAA@@@@OOOO