Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Persistence and Object-Relational Mapping Slides by James Brucker, used with his permission 1.

Similar presentations


Presentation on theme: "Data Persistence and Object-Relational Mapping Slides by James Brucker, used with his permission 1."— Presentation transcript:

1 Data Persistence and Object-Relational Mapping Slides by James Brucker, used with his permission 1

2 Goal  Applications need to save data to persistent storage.  Persistent storage can be database, directory service, or other.  For O-O programming, we'd like to save and retrieve objects to/from storage. Java Application object Persistent Storage 2

3 The Problem with Databases  Databases store data in rows in tables, which are not like objects.  We can simulate object associations and collections using relations between rows in tables.  Preserving uniqueness of objects and some object properties using persistence is difficult.  Some conceptual differences exist, referred to as the Object-Relational Paradigm Mismatch 3

4 Object-Relational Mapping Purpose:  save object as a row in a database table  retrieve data from tables and create objects  save and recreate associations between objects Design Goals:  separate object-relational mapping services from the rest of our program  minimize the impact of changing database vendor or database schema 4

5 An Example An Event Manager application with these classes: 5

6 Object-Relational Mapping Map between an object and a row in a database table. LOCATIONS PKidINTEGER nameVARCHAR(80) addressVARCHAR(160) Location id: int name: String address: String Class should have an identifier attribute Database Table identifier is usually the primary key of table Data Mapper convert object to table row data, convert data types, instantiates objects 6

7 Mapping an Object LOCATIONS idnameaddress 101Kasetsart University90 Pahonyotin... 102Seacon Square120 Srinakarin... ku : Location id = 101 name = "Kasetsart University" address = "90 Pahonyotin..." object diagram save( ) 7

8 O-R Mapping Code for Location (1) Location ku = new Location( "Kasetsart University" ); ku.setAddress( "90 Pahonyotin Road; Bangkok" ); // save the location dataMapper.save( location ); Issues: data mapper should choose a unique ID for persisted objects what happens if same data is already in the table? 8

9 O-R Mapping Code for Location (2) // retrieve the location Location ku1 = dataMapper.find( "Kasetsart University" ); Location ku2 = dataMapper.find( "Kasetsart University" ); how to we tell find what field to search for? id? name? our code does same find twice, does mapper return the same object? ( ku1 == ku2 ) => true or false? // update the address ku1.setAddress( "Kampaengsaen Road; Kampaengsaen" ); is the address updated automatically in the database? 9

10 Transparent Persistence Location ku = new Location( "Kasetsart University" ); ku.setAddress( "90 Pahonyotin Road; Bangkok" ); // save the location dataMapper.save( ku ); // change the address ku.setAddress( "Kampaengsaen, Nakorn Pathom" ); With transparent persistence, any changes to a persistent object are automatically propagated to the database. LOCATIONS idnameaddress 101Kasetsart UniversityKampaengsaen... 102Seacon Square120 Srinakarin... 10

11 O-R Mapping of n-to-1 Associations Event id: int name: String startDate: Date location: Location Location id: int name: String address: String 1 * 11

12 O-R Mapping of n-to-1 Associations Event id: int name: String startDate: Date location: Location LOCATIONS PKidINTEGER nameVARCHAR addressVARCHAR Location id: int name: String address: String EVENTS PKidINTEGER nameVARCHAR start_date TIMESTAMP FKlocation_id INTEGER The Data Mapper converts a n-to-1 association to a foreign key relation (persist) or foreign key to object (retrieve). 1 * 12

13 O-R Mapping Code for Event Event event = new Event( "Java Days" ); Location ku = new Location( "Kasetsart University" ); ku.setAddress( "90 Pahonyotin Road; Bangkok" ); event.setLocation( ku ); event.setStartDate( new Date(108,Calendar.JULY, 1) ); // save the event dataMapper.save( event ); when we save the event, does dataMapper save the location, too? 13

14 O-R Mapping Code for Event // retrieve the event Event evt = dataMapper.find( "Java Days" ); Location location = evt.getLocation( ); // null? when we get the event, does the dataMapper create the location, too? // delete the event Event evt = dataMapper.find( "Java Days" ); dataMapper.delete( evt ); does the dataMapper delete the location, too? what if other events (still in database) also refer to this location? 14

15 O-R Mapping of 1-to-n Associations Event id: int name: String startDate: Date Speaker id: int name: String telephone: String speakers * 15

16 O-R Mapping of 1-to-n Associations Event id: int name: String startDate: Date SPEAKERS PKidINTEGER nameVARCHAR telephoneVARCHAR FKevent_idINTEGER Speaker id: int name: String telephone: String EVENTS PKidINTEGER nameVARCHAR start_date TIMESTAMP FKlocation_id INT Event has a collection of Speakers. The Data Mapper must save collection as Speaker entries with FK reference to Event. speakers * 16

17 O-R Mapping Code for Collections (1) Event event = new Event( "Java Days" ); event.setLocation( ku ); // add event speakers Speaker gosling = new Speaker( "James Gosling" ); Speaker yuen = new Speaker( "Prof. Yuen" ); event.getSpeakers().add( gosling ); event.getSpeakers().add( yuen ); // save the event dataMapper.save( event ); Issues: same issues as many-to-1 association 17

18 O-R Mapping Code for Collections (2) // retrieve the event Event evt = dataMapper.find( "Java Days" ); Set speakers = evt.getSpeakers( ); out.println( "Speakers for " + evt.getName( ) ); for( Speaker spkr : speakers ) out.print( spkr.getName() ); what kind of collection does dataMapper return? can we use any collection we want in the Event class? public class Event { private Set speakers = new ______; // ? what kind of collection ? public setSpeakers( Set speakers ) { this.speakers = speakers; } 18

19 O-R Mapping of Ordered Collections Event id: int name: String startDate: Date Session id: int name: String speaker: Speaker sessions {ordered}* 19

20 O-R Mapping of Ordered Collections Event id: int name: String startDate: Date SESSIONS PKidINTEGER nameVARCHAR FKevent_idINTEGER session_idxINT FKspeaker_idINT Session id: int name: String EVENTS PKidINTEGER nameVARCHAR start_date TIMESTAMP FKlocation_id INT Event has a list or array of Sessions. The Data Mapper must store a foreign key and a list index in the Session table. sessions {ordered}* 20

21 O-R Mapping Code for a List // add sessions to the event we already saved Event event = dataMapper.find( "Java Days" ); Speaker gosling = dataMapper.find( "James Gosling" ); Session opening = new Session( "Opening Ceremony" ) ); opening.setSpeaker( gosling ); // make opening be the 1st session (sessions is a List) event.getSessions().add( 0, opening );... add more sessions... // update the event dataMapper.update( event ); does dataMapper use the existing data for gosling in the new Session? what if our update changes the indices of other objects in the list? 21

22 O-R Mapping of m-to-n Associations Event id: int name: String startDate: Date Attendee id: int name: String telephone: String attendees * events * 22

23 O-R Mapping of m-to-n Associations Event id: int name: String startDate: Date ATTENDEES PKidINTEGER nameVARCHAR telephoneVARCHAR Attendee id: int name: String telephone: String EVENTS PKidINTEGER nameVARCHAR start_date TIMESTAMP FKlocation_id INT attendees * events * EVENT_ATTENDEE PKidINTEGER FKevent_idINTEGER FKattendee_idINTEGER 23

24 Design of a Data Mapper Problem: What behavior do we need for a data mapper? What operations should it perform? 24

25 Object-Relational Operations: CRUD Common O-R operations are: Create - save (persist) a new object in the database Retrieve an object from the database Update data for an object already saved in database Delete object's data from the database 25

26 Design Model for Data Mapper Data Mapper load( id ) : T find( query : String ) : T[*] findAll( ) : T[*] save( object : T ) update( object : T ) delete( object : T ) T A UML Type Parameter The method to "load" an Object by its identifier is sometimes named: load( id ) the Hibernate method name and Spring name find( id ), findById( id ) get( id ) similar to load( id ) but no exception if id is not found 26

27 A Data Mapping for Event Class Data Mapper is also called "Data Access Object" (DAO).  Hibernate uses the term data access object.  We use DAO in data mapper names, e.g. EventDao. EventDao findById( id: int ) : Event find( query: String ) : Event[*] save( evt: Event ) update( evt: Event ) delete( evt: Event ) 27

28 Layered Design User Interface Application Logic Domain Objects DAO O-R Mapping Framework Other Services JDBC Foundation Classes ui event CRUD request ORM API domain object data xfer object JDBC API ResultSet, etc. 28

29 What's Next? The Choices: 1. Write the OR Mapping yourself using Java and JDBC  SQL Fundamentals  JDBC Fundamentals  Configure Database 2. Use an existing O-R Framework  Compare O-R frameworks  Learn to use one framework  Configure Database 29

30 Transactions  These frameworks generally go beyond CRUD  They also allow something called a “transaction” begin_xtn(); operations on the database commit_xtn() or abort_xtn();  Has all or nothing guarantees.  And they support locking for concurrency control. 30

31 Persistence Frameworks  Hibernate - widely used open-source persistence framework for Java. Persistence of POJOs, uses mapping files and object-query language to decouple Java from database. NHibernate for.Net languages.  iBatis - simple, uses SQL maps. Database schema not transparent to Java code.  Entity Enterprise JavaBeans - uses EJB container services to perform persistence. Resource hog.  Cayenne - Apache project, has GUI modeler that eliminates need to write xml files. Can reverse engineer database or generate database schema & Java code.  TopLink (Oracle), Torque (Apache DB), Castor,... 31

32 Standards and APIs  Java Data Objects (JDO) - transparent persistence of POJOs; defines query language (JDOQL) and standard for XML descriptors. implementations: Kodo, JPOX  Java Persistence API (JPA) - part of the EJB 3.0, defines OR standard, query language (JPQL), and standalone POJO or EJB server-based persistence. implementations: TopLink Essentials (Glassfish project), OpenJPA. Hibernate is JPA compliant. Article: Adopting a Java Persistence Framework, http://today.java.net/pub/a/today/2007/12/18/adopting-java- persistence-framework.html 32


Download ppt "Data Persistence and Object-Relational Mapping Slides by James Brucker, used with his permission 1."

Similar presentations


Ads by Google