| 
					
						 Hibernate version: 2.1
 Name and version of the database you are using: Oracle 9i
 
 I am new to Hibernate.  Trying to experiment with it to see if it will save us development/maintenance time accessing our Oracle databases.  Started with simple test structure of one table.  Persistence went well.  However, started experiencing difficulty with persisting data into a related table.  In the experiment, I have just two tables that have a one-to-one relationship.  
 
 Table = Test_Sro
 Sro_Number		VarChar2 (Primary Key)
 State			Number
 Working_Npa		VarChar2
 Working_Nxx		VarChar2
 Working_Line		VarChar2
 
 Table = Test_Caller
 Sro_Number		VarChar2 (Primary Key, Foreign Key back to Test_Sro.SroNumber)
 Name			VarChar2
 Caller_Npa		VarChar2
 Caller_Nxx		VarChar2
 Caller_Line		VarChar2
 
 The Sro_Numebr is the primary key for both tables.  There is a foreign key relationship between Test_Caller and Test_Sro.   A row in Test_Caller cannot exist if the same Sro_Number doesn’t exist in the Test_Sro table.  
 
 I have three classes:
 Sro {private String id; private int state; private Contact caller; private Tn workingTn;}
 Tn {private String npa; private String nxx; private String line;}
 Contact {private String name; private Tn tn;}
 Each of the three classes have getters and setters for each of the attributes listed above.  I used the Using the “Foreign key association example” in the Hibernate In Action book (page 221), but was unable to get records persisted to the Test_Caller table.  
 
 My JUnit code looks like this:
 public void testSaveWithContact() throws Exception {
 	// Start session transaction
 	Session session = sessions.openSession(connection);
 	Transaction transaction = session.beginTransaction();
 	// Create SRO & set attributes
 	Sro sro = new Sro();
 	sro.setId("103");
 	sro.setState(2);
 	Tn tn = new Tn("314", "555", "1212");
 	sro.setWorkingTn(tn);
 		
 	Contact caller = new Contact();
 	caller.setName("John Doe");
 	Tn callerTn = new Tn("636", "300", "4444");
 	caller.setTn(callerTn);
 	sro.setCaller(caller);
 	// Save the SRO and commit the database work.  
 	session.save(sro, sro.getId());
 	transaction.commit();
 	session.close();
 }
 
 My initial mapping looked like this:
 <hibernate-mapping>
 	<class	name="HibernateTest.Sro" table="TEST_SRO">
 		<id name="id" column="SRO_NUMBER" type="string"> <generator class="native"></generator></id>
 		<property name="state" type="integer" column="STATE" />	
 		<component name="workingTn" class="HibernateTest.Tn">
 			<property name="npa" type="string" column="WORKING_NPA" />
 			<property name="nxx" type="string" column="WORKING_NXX" />
 			<property name="line" type="string" column="WORKING_LINE" />
 		</component>
 		<one-to-one name="caller" class="HibernateTest.Contact" cascade="all"/>
 	</class>
 	<class	name="HibernateTest.Contact" table="TEST_CALLER">
 		<id name="id" column="SRO_NUMBER"> <generator class="foreign"> <param name="property">sro</param></generator></id>
 		<property name="name" column="NAME" type="string"/>
 		<component name="tn" class="HibernateTest.Tn">
 			<property name="npa" type="string" column="CALLER_NPA" />
 			<property name="nxx" type="string" column="CALLER_NXX" />
 			<property name="line" type="string" column="CALLER_LINE" />
 		</component>
 		<one-to-one name="sro" class="HibernateTest.Sro" constrained="true"></one-to-one>
 	</class>
 </hibernate-mapping>
 
 I received the followed trace message when I tried to run the test:
 net.sf.hibernate.MappingException: Error reading resource: SroMap.xml
 Caused by: net.sf.hibernate.MappingException: Problem trying to set property type by reflection
 Caused by: net.sf.hibernate.PropertyNotFoundException: field not found: id
 
 I assumed it needed an “id” attribute in the Contact class.  I’d prefer not do this since the class really doesn’t need the additional overhead.  I added it anyway just to get the test working.  After that, I received the following error though.
 net.sf.hibernate.PropertyNotFoundException: Could not find a getter for sro in class HibernateTest.Contact
 
 Based on the above exception/message it appears that Hibernate is expecting the Contact class to have a reference back to it’s parent class in order to persist the data.  I reluctantly added a reference back to the Sro class within the Contact class and set the attribute/reference in the test. 
 
 When I run the test, a record was inserted to the Test_Sro table, but no record was inserted to the Test_Caller table.  The following exception occurred:
 net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)
 
 Can anyone help me build the map so that I don’t have to put references in the Contact class back to the Sro class and it’s id attribute?  
					
  
						
					 |