I have a class called CodedResponse that has a field whose type is
Set<CodedAnswer>. The CodedAnswer class has a field whose type is
CodedResponse. When I try to persist a CodedAnswer object, I get an exception
that I don't understand how to fix. CodedResponses seem to persist fine. Here
are the details:
org.hibernate.exception.GenericJDBCException
could not insert: [org.openmrs.module.draftforms.CodedAnswer]
org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
org.openmrs.module.draftforms.db.hibernate.HibernateDraftFormsDAO.saveOrUpdateCodedAnswer(HibernateDraftFormsDAO.java:170)
org.openmrs.module.draftforms.impl.DraftFormsServiceImpl.saveOrUpdateCodedAnswer(DraftFormsServiceImpl.java:172)
...
org.openmrs.module.draftforms.web.controller.EditDropRadioCheckFormController.handleSubmission(EditDropRadioCheckFormController.java:142)
...
My classes are:
public class CodedResponse extends Item{
private Integer num; //The number of the item
private Concept concept;
private char selectionStyle; // 'c' is checkbox; 'r' is radio button
private boolean checkbox; // True if the options are to be displayed
checkbox style
private boolean radio; // True if the options are to be displayed radio
button style
private boolean dropdown; // True if the options are to be displayed
dropdown menu style
private Set<CodedAnswer> answers = new TreeSet<CodedAnswer>(); // A list of
the possible answers
...
}
public class CodedAnswer implements Comparable<CodedAnswer> {
public static final long serialVersionUID = 1L;
private Integer id; //The id of the Item
private Integer answerNumber; // For ordering the answers
private String title; //The title of the answer
private CodedResponse codedResponse; //The CodedResponse this is an answer
to
private Concept concept;
private boolean other = false;; //If true, this is an "other" option
private String text = ""; // Additional text to go with the answer.
...
}
My hbm.xml files contain:
<hibernate-mapping package="org.openmrs.module.draftforms">
<id name="id" type="int" column="id" unsaved-value="0">
<generator class="native" />
</id>
<property name="title" type="java.lang.String" column="title"
not-null="true"/>
<many-to-one name="concept" column="concept_id"
class="org.openmrs.Concept" />
<property name="other" type="java.lang.Boolean" column="other"
length="1" />
<property name="text" type="java.lang.String" column="text"
length="500" />
<many-to-one
name="codedResponse"
column="coded_response_id"
class="CodedResponse"
not-null="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping package="org.openmrs.module.draftforms">
<class name="Item" table="draftforms_items">
<id name="id" type="int" column="id" unsaved-value="0">
<generator class="native" />
</id>
...
<joined-subclass name="CodedResponse"
table="draftforms_coded_response">
<key column="id"/>
<property name="num" type="int" column="num"/>
<many-to-one name="concept" column="concept_id"
class="org.openmrs.Concept" />
<property name="checkbox" type="java.lang.Boolean"
column="checkbox" length="1" />
<property name="radio" type="java.lang.Boolean"
column="radio" length="1" />
<set name="answers" inverse="true">
<key column="coded_response_id"
not-null="true"/>
<one-to-many class="CodedAnswer"/>
</set>
</joined-subclass>
</class>
</hibernate-mapping>
The mysql tables are:
mysql> describe draftforms_coded_response;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| num | varchar(3) | YES | | NULL | |
| concept_id | int(10) | YES | | NULL | |
| checkbox | tinyint(1) | YES | | NULL | |
| radio | tinyint(1) | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
mysql> describe draftforms_coded_answer;
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| title | varchar(50) | YES | | NULL | |
| concept_id | int(10) | YES | | NULL | |
| other | tinyint(1) | YES | | NULL | |
| text | varchar(500) | YES | | NULL | |
| coded_response_id | int(11) | YES | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
The code that does the persistence looks like this:
Set<CodedAnswer> possibleAnswers = new TreeSet<CodedAnswer>();
for (ConceptAnswer answer : response.getConcept().getAnswers()) {
CodedAnswer nextPossibleAnswer = new CodedAnswer(answer, response);
possibleAnswers.add(nextPossibleAnswer);
}
response.setAnswers(possibleAnswers);
service.saveOrUpdateCodedResponse(response);
// Need to make the question persistent before the answers
for (CodedAnswer answer : response.getAnswers()) {
service.saveOrUpdateCodedAnswer(answer); <-- This is the line
referenced in the stack trace
}
------------------
Barbara Lerner
Associate Professor
Computer Science Dept.
Mt. Holyoke College
_________________________________________
To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to
[email protected] with "SIGNOFF openmrs-devel-l" in the body (not
the subject) of your e-mail.
[mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l]