OpenMRS currently uses Hibernate to connect the OpenMRS objects to the relational database tables.
You can see the hibernate mapping files in [source:openmrs/trunk/metadata/api/hibernate].
Modules must add hibernate.hbm.xml files to their /metadata file AND reference them in their config.xml files in the <mappingFiles> element.
[edit]
Example Java Object
package org.openmrs;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
/**
* ConceptName is the real world term used to express a Concept within the idiom of a particular
* locale.
*/
public class ConceptName extends BaseOpenmrsObject implements Auditable {
// Fields
private Integer conceptNameId;
private Concept concept;
private String name;
private Locale locale;
private Collection<ConceptNameTag> tags;
// Constructors
/** default constructor */
public ConceptName() {
}
/**
* Convenience constructor to create a ConceptName object by primary key
*
* @param conceptNameId
*/
public ConceptName(Integer conceptNameId) {
this.conceptNameId = conceptNameId;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (!(obj instanceof ConceptName)) {
return false;
}
ConceptName rhs = (ConceptName) obj;
if (this.conceptNameId != null && rhs.conceptNameId != null)
return (this.conceptNameId.equals(rhs.conceptNameId));
else
return this == obj;
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
if (this.getConceptNameId() == null)
return super.hashCode();
int hash = 3;
hash = hash + 31 * this.getConceptNameId();
return hash;
}
public Integer getConceptNameId() {
return conceptNameId;
}
public void setConceptNameId(Integer conceptNameId) {
this.conceptNameId = conceptNameId;
}
public Concept getConcept() {
return concept;
}
public void setConcept(Concept concept) {
this.concept = concept;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale;
}
public Collection<ConceptNameTag> getTags() {
return tags;
}
public void setTags(Collection<ConceptNameTag> tags) {
this.tags = tags;
}
}
package org.openmrs; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Locale; /** * ConceptName is the real world term used to express a Concept within the idiom of a particular * locale. */ public class ConceptName extends BaseOpenmrsObject implements Auditable { // Fields private Integer conceptNameId; private Concept concept; private String name; private Locale locale; private Collection<ConceptNameTag> tags; // Constructors /** default constructor */ public ConceptName() { } /** * Convenience constructor to create a ConceptName object by primary key * * @param conceptNameId */ public ConceptName(Integer conceptNameId) { this.conceptNameId = conceptNameId; } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (!(obj instanceof ConceptName)) { return false; } ConceptName rhs = (ConceptName) obj; if (this.conceptNameId != null && rhs.conceptNameId != null) return (this.conceptNameId.equals(rhs.conceptNameId)); else return this == obj; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { if (this.getConceptNameId() == null) return super.hashCode(); int hash = 3; hash = hash + 31 * this.getConceptNameId(); return hash; } public Integer getConceptNameId() { return conceptNameId; } public void setConceptNameId(Integer conceptNameId) { this.conceptNameId = conceptNameId; } public Concept getConcept() { return concept; } public void setConcept(Concept concept) { this.concept = concept; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Locale getLocale() { return locale; } public void setLocale(Locale locale) { this.locale = locale; } public Collection<ConceptNameTag> getTags() { return tags; } public void setTags(Collection<ConceptNameTag> tags) { this.tags = tags; } }
[edit]
Hibernate Mapping File
This mapping file works with the above concept.
Some attributes defined here (like uuid, creator, voided, etc) are defined on the parent class of ConceptName.
<generator />can also be the custom openmrs<generator />
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.1//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.openmrs"> <class name="ConceptName" table="concept_name"> <id name="conceptNameId" type="int" column="concept_name_id"> <generator /> </id> <many-to-one name="concept" column="concept_id" class="Concept" not-null="true"/> <property name="name" type="java.lang.String" length="65535" not-null="true" /> <property name="locale" type="java.util.Locale" length="50" not-null="true"/> <property name="dateCreated" type="java.util.Date" column="date_created" not-null="true"/> <many-to-one name="creator" column="creator" not-null="true"/> <property name="voided" type="java.lang.Boolean" column="voided" length="1" not-null="true" /> <property name="dateVoided" type="java.util.Date" column="date_voided" length="19" /> <property name="voidReason" type="java.lang.String" column="void_reason" length="255" /> <many-to-one name="voidedBy" column="voided_by" /> <set name="tags" table="concept_name_tag_map" cascade="save-update"> <key column="concept_name_id"/> <many-to-many column="concept_name_tag_id"/> </set> <property name="uuid" type="java.lang.String" column="uuid" length="38" unique="true" /> </class> </hibernate-mapping>