If people are in agreement, I would like to address some proposed issues relating to Hibernate from the wiki/notepad page:
? How to extend an OpenMRS object
? How to set up a relationship with an OpenMRS object
? How to do subclasses correctly
These are of current interest to me due to the following use case:
1. The current Order object does not have a column for urgency ("stat" orders)
2. The current Order object only allows for a single specimen per order, when there are cases when multiple specimens must be taken for a single order

I believe this issue has previously been addressed in https://openmrs.atlassian.net/wiki/display/docs/Extending+a+Table+Through+a+Module but I find this hard to comprehend (perhaps because it is too specific to the Encounter use case). Also, it appears that it supplants the core Encounter table with a module-defined Encounter table. I am concerned that this may not be the best practice because it means that other modules cannot also extend Encounter.

I have been thinking in terms of two tables, one which would be an auxiliary orders table that would contain the urgency field and have a 1-1 relationship with orders, and the other of which would be a relationship table that would relate orders table rows to 0:n specimen rows. I would prefer to leave core blissfully ignorant of these tables. My questions:
(1) What are the right Hibernate declarations for these tables?
(2) How much of the audit info should be included in each table?
(3) Is it a good idea to write the DAO layer so that the two tables appear as a single table or should only the methods associated with the auxiliary table be addressed?
(4) How should the save be handled?

Gliffy Diagram is only supported by the cloud editor

Because Forge macros arent supported by the legacy editor, you'll need to convert this content to the cloud editor to display this macro properly. Find out more about converting to the cloud editor

LabOrder.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.openmrs.module.jsslab.LabOrder" table="jsslab_order"> <id name="orderId" column="order_id"> <generator class="foreign"> <param name="property">order</param> </generator> </id> <one-to-one name="order" class="org.openmrs.Order" constrained="true" /> <property name="urgent" type="java.lang.Boolean" column="urgent" not-null="true" /> <many-to-one name="retestOf" class="org.openmrs.module.jsslab.LabOrder" not-null="false" column="retest_of" /> <property name="physicianRetest" type="java.lang.Boolean" not-null="false" column="physician_retest" /> <property name="retestReason" type="java.lang.String" column="retest_reason" length="255" /> <property name="uuid" type="java.lang.String" column="uuid" length="38" unique="true" /> <set name="specimens" inverse="true" > <key column="order_id" not-null="true" /> <one-to-many class="org.openmrs.module.jsslab.LabOrderSpecimen" /> </set> </class> </hibernate-mapping>

LabOrderSpecimen.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.openmrs.module.jsslab.LabOrderSpecimen" table="jsslab_order_specimen" > <id name="orderSpecimenId" type="int"> <column name="order_specimen_id" /> <generator class="native" /> </id> <many_to_one name="labSpecimen" type="org.openmrs.module.jsslab.LabSpecimen" column="lab_specimen_id" not-null="true" /> <many_to_one name="labOrder" type="org.openmrs.module.jsslab.LabOrder" column="lab_order_id" not-null="true" /> <many-to-one name="creator" class="org.openmrs.User" not-null="true" column="creator"/> <property name="dateCreated" type="java.util.Date" column="date_created" not-null="true" length="19" /> <many-to-one name="changedBy" class="org.openmrs.User" column="changed_by" /> <property name="dateChanged" type="java.util.Date" column="date_changed" /> <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" /> <property name="uuid" type="java.lang.String" column="uuid" length="38" unique="true" /> </class> </hibernate-mapping>