I'm a newbie at hibernate, so if I've done something obvious and stupid, I apologize. I don't understand what I've done wrong here. I have a a Person class which is associated with 0..* addresses. Each Address has a key composed of the associated person (a number, in the database) and a "tag" (basically a name for the address). Everything seems to work fine until I attempt to iterate through the returned address collection. The collection (which indicated its size was 1 immediately before this) returns a NoSuchElementException.
Can anyone help?
Hibernate version: 305
Mapping documents:
Code:
<hibernate-mapping package="net.vickerscraven.learning.hibernate">
<class name="Person" table="person">
<id name="id" column="per_id" unsaved-value="null">
<generator class="native"/>
</id>
<property name="firstName" column="per_first_name" not-null="true"/>
<property name="lastName" column="per_last_name" not-null="true"/>
<property name="birthDate" column="per_birth_date" not-null="true"/>
<property name="weightInKilograms" column="per_weight_kg" not-null="true"/>
<property name="heightInMeters" column="per_height_m" not-null="true"/>
<set name="addresses" lazy="false" inverse="true">
<key column="per_id"/>
<one-to-many class="Address"/>
</set>
</class>
</hibernate-mapping>
Code:
<?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 package="net.vickerscraven.learning.hibernate">
<class name="Address" table="address">
<composite-id>
<key-many-to-one name="owner" class="Person" column="per_id"/>
<key-property name="tag" column="tag"/>
</composite-id>
<property name="address" column="address" not-null="true"/>
<property name="address2" column="address2" not-null="false"/>
<property name="city" column="city" not-null="true"/>
<property name="state" column="state" not-null="true"/>
<property name="zip" column="zip"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():Code:
Query q = session.createQuery("from Person p where p.firstName = 'Aaron'");
List results = q.list();
System.out.println(results.size() + " result(s) found.");
Iterator iter = results.iterator();
while (iter.hasNext()) {
person = (Person)iter.next();
System.out.println(person.getFirstName() + " " + person.getLastName());
addresses = person.getAddresses();
addressIter = addresses.iterator();
System.out.println(person.getFirstName() + " has " + addresses.size() + " associated addresses:");
while (addressIter.hasNext()) {
address = (Address)iter.next();
System.out.println(address.getTag());
}
}
Full stack trace of any exception that occurs:Code:
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(Unknown Source)
at net.vickerscraven.learning.hibernate.TestHibernate.main(TestHibernate.java:56)
Name and version of the database you are using:
PostgreSQL 8.?
The generated SQL (show_sql=true):
select person0_.per_id as per1_, person0_.per_first_name as per2_1_, person0_.per_last_name as per3_1_, person0_.per_birth_date as per4_1_, person0_.per_weight_kg as per5_1_, person0_.per_height_m as per6_1_ from person person0_ where person0_.per_first_name='Aaron'
followed by
select addresses0_.per_id as per1_1_, addresses0_.tag as tag1_, addresses0_.per_id as per1_0_, addresses0_.tag as tag0_, addresses0_.address as address0_0_, addresses0_.address2 as address4_0_0_, addresses0_.city as city0_0_, addresses0_.state as state0_0_, addresses0_.zip as zip0_0_ from address addresses0_ where addresses0_.per_id=?
Debug level Hibernate log excerpt: