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;
	}
}

[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>