irmis rdbcore java api

12
A U.S. Department of Energy Office of Science Laboratory Operated by The University of Chicago Argonne National Laboratory Office of Science U.S. Department of Energy IRMIS rdbCore Java API Object-Relational Modelling (ORM)

Upload: kendra

Post on 29-Jan-2016

62 views

Category:

Documents


0 download

DESCRIPTION

IRMIS rdbCore Java API. Object-Relational Modelling (ORM). IRMIS rdbCore Java API. What is rdbCore? Database schema definition (ddl) Static for now, but possible to generate for multiple db Process variable crawler Java database access layer (also PHP) Source code tree overview. irmis/ - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: IRMIS rdbCore Java API

A U.S. Department of EnergyOffice of Science LaboratoryOperated by The University of Chicago

Argonne National Laboratory

Office of ScienceU.S. Department of Energy

IRMIS rdbCore Java API

Object-Relational Modelling (ORM)

Page 2: IRMIS rdbCore Java API

2

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• What is rdbCore?- Database schema definition (ddl)

- Static for now, but possible to generate for multiple db- Process variable crawler- Java database access layer (also PHP)

• Source code tree overview

irmis/

apps/ -> pv viewer, component viewer/editor, etc.

rdbCore/ -> rdbCore.jar

ddl/

crawler/perl/

db/

php/

java/

gov/anl/aps/irmis/persistence/pv

Page 3: IRMIS rdbCore Java API

3

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Object-Relational Mapping (ORM)- Bridges gap between relational data model and object-oriented

data model of applications- This “gap” responsible for a significant amount of development

and maintenance hours- ORM allows focus on application and data, not transforming

between the two models

• Java ORM <==> Hibernate (Gavin King)- LGPL license- Development began in 2001- Joined jboss.org in 2003, so commercial support and training

available- Very popular, mature, with active support forums- Excellent book “Hibernate in Action” (2005 - Bauer, King)

Page 4: IRMIS rdbCore Java API

4

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Data Objects- IOC Record- IOCBoot RecordType- IOCResource Field- URI FieldType

• Data Access Objects- IOCBootDAO

- IOCBoot findByIocName(String iocName)- List findCurrentLoads()

- RecordDAO- setRecordTypeConstraint(List recTypes)- setRecordNameGlobConstraint(String recNamePattern)- List findByConstraints()

Page 5: IRMIS rdbCore Java API

5

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Code example// retrieve set of current ioc boot instances, and all their process variables

IOCBootDAO ibDAO = new IOCBootDAO();

List bootList = null;

Try {

bootList = ibDAO.findCurrentLoads();

} catch (DAOException de) {

// handle exception

}

// iterate over the results

Iterator bootIt = bootList.iterator();

while (bootIt.hasNext()) {

IOCBoot iocBoot = (IOCBoot)bootIt.next();

String iocName = iocBoot.getIoc().getIocName();

List resources = iocBoot.getIocResources(); // eager fetch, so data already here

List records = iocBoot.getRecords(); // lazy, so addtl. query issued here

}

Page 6: IRMIS rdbCore Java API

6

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• How is this done with Hibernate?- Design the object model and relational schema (what order?)

- Depends on whether rdbms schema came first or not- APS designed rdbms schema with application in mind, so our

object model entities are almost 1-to-1 with relational entities (hibernate still a big plus).

- Hibernate can auto-generate class source code and/or ddl if desired

- APS manually created classes and ddl (for now)

Page 7: IRMIS rdbCore Java API

7

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Hibernate revolves around Session class

Session session = sessionFactory.openSession()

hibernate.cfg.xml

IOCBoot.hbm.xml

Field.hbm.xml

Record.hbm.xml

<hibernate-configuration>

<session-factory>

<property name=“connection.*” value=“blah”/>

<property name=“dialect” value=“net.sf.hibernate.dialect.MySQLDialect” />

<mapping resource=“gov/anl/aps/irmis/persistence/pv/Record.hbm.xml” />

<mapping resource=“gov/anl/aps.irmis/persistence/pv/Field.hbm.xml” />

<mapping resource=“gov/anl/aps/irmis/persistence/pv/IOCBoot.hbm.xml” />

</session-factory>

</hibernate-configuration>

hibernate.cfg.xml

Page 8: IRMIS rdbCore Java API

8

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Partial Record.hbm.xml mapping

<hibernate-mapping>

<class name=“gov.anl.aps.irmis.persistence.pv.Record”

table=“rec” lazy=“true” >

<id name=“id” column=“rec_id” type=“long” >

<generator class=“native”/>

</id>

<property name=“recordName” type=“string” column=“rec_nm” />

<set name=“fields” inverse=“true” lazy=“true” >

<key column=“rec_id” />

<one-to-many class=“gov.anl.aps.irmis.persistence.pv.Field” />

</set>

<many-to-one name=“recordType” column=“rec_type_id”

class=“gov.anl.aps.irmis.persistence.pv.RecordType” />

</class>

</hibernate-mapping>

Page 9: IRMIS rdbCore Java API

9

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Record class (Record.java)Public class Record implements Serializable {

private Long id;

private String recordName;

private Set fields = new HashSet();

private RecordType recordType;

// constructor and accessor methods

public Record() {}

public Long getId() { return this.id; }

public void setId(Long id) { this.id = id; }

public Set getFields() { return this.fields; }

public void setFields(Set fields) {

this.fields = fields;

}

public void addField(Field field) {

field.setRecord(this);

fields.add(field);

}

public boolean equals (Object o) {

if (this == other) return true;

if (!(other instanceof Record))

return false;

final Record castO = (Record)o;

return this.getIocBoot().getId()==castO

.getIocBoot().getId() && this.getRecordName()

==castO.getRecordName();

}

public int hashCode() {

int result = HashCodeUtil.SEED;

result = HashCodeUtil.hash(result, getIocBoot().getId());

result = HashCodeUtil.hash(result, getRecordName());

return result;

}

}

Page 10: IRMIS rdbCore Java API

10

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Querying for objects using HQL (Hibernate Query Language)- What is HQL?

- minimal OO extension to SQL select- Why?

- Query in terms of objects you are interested in- Db independence since Hibernate generates SQL for your db- Optimization - hibernate generally makes optimal SQL

List records = session.find(“select from Record r where r.recordName like ‘ABC%’”);

List records = session.find(“from Record r join fetch r.fields”);

IOCBoot boot = session.find(“from IOCBoot ib where ib.ioc.iocName = ‘iocpar01’”);

- OR - if you absolutely have to use native SQL and JDBC

Connection con = session.connection();

// any JDBC stuff can be done here

Page 11: IRMIS rdbCore Java API

11

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Saving or updating new objects

Record rec = new Record();

rec.setRecordName(“AB:CD:ai”);

// set remaining fields except id

Transaction tx = session.beginTransaction();

session.saveOrUpdate(rec);

tx.commit();

Page 12: IRMIS rdbCore Java API

12

Pioneering Science andTechnology

Office of Science U.S. Department

of Energy

IRMIS rdbCore Java API

• Hibernate experience- It has a learning curve (2 weeks ?)- Very active support forums where core developers lurk and

answer questions within hours- Extremely flexible

- Only a small corner of mapping possibilities shown- Will work with schemas using natural keys- Objects can be mapped to one or many tables, either through

composition or association- Easy to tweak mappings and watch behavior of SQL

(comparing query time using lazy versus eager fetch)- Good log output (uses commons-logging and log4j)