IRMIS rdbCore Java API
description
Transcript of IRMIS rdbCore Java API
![Page 1: IRMIS rdbCore Java API](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/1.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/3.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/4.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/5.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/6.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/8.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/10.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062323/568157c9550346895dc5524a/html5/thumbnails/12.jpg)
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)