I updated from cvs this morning. I tried out collection caching and am not
getting the results I expect.
Here's some detail:
I have AddresseeGroups which are made up of AddresseeGroupEntrys of either
other AddresseeGroups or Staff.
AddresseeGroup --> AddresseeGroupEntry --> Staff
^ |
| |
---------------------
I've mapped it like this (I've left out the package names to make it more
readable):
<class name="AddresseeGroup" table="addressee_group">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="description"/>
<set role="entries">
<key column="addressee_group_owner_id"/>
<one-to-many class="AddresseeGroupEntry"/>
</set>
</class>
<class name="AddresseeGroupEntry" table="addressee_group_entry">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<many-to-one
name="owner"
class="AddresseeGroup"
column="addressee_group_owner_id"
cascade="none"
outer-join="true"/>
<many-to-one
name="groupEntry"
class="AddresseeGroup"
column="addressee_group_entry_id"
cascade="none"
outer-join="true"/>
<many-to-one
name="staffEntry"
class="StaffImpl"
column="staff_id"
cascade="none"
outer-join="true"/>
</class>
<class name="StaffImpl" table="staff"> <!-- proxy="Staff"> -->
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="staffId" column="staffid"/>
<component name="name" class="Name">
<property name="firstName" column="firstname"/>
<property name="middleInitial" column="middleinitial"/>
<property name="lastName" column="lastname"/>
</component>
<property name="privilegeLevel" column="privilege_level"/>
</class>
So I figure I can do the following:
session.find("from staff in class StaffImpl");
session.find("from age in class AddresseeGroupEntry");
List groups = dao.currentSession.find("from ag in class AddresseeGroup");
And I would expect 3 SQL statements with all the many-to-ones and
collections should get resolved from the cache. My first shot at this
returned:
cirrus.hibernate.HibernateException: You tried to persist an object with a
reference to a transient instance - save the transient instance first
at
cirrus.hibernate.type.PersistentObjectType.getID(PersistentObjectType.java:9
4)
at
cirrus.hibernate.type.PersistentObjectType.nullSafeSet(PersistentObjectType.
java:79)
at
cirrus.hibernate.impl.ClassPersister.dehydrate(ClassPersister.java:677)
at
cirrus.hibernate.impl.ClassPersister.update(ClassPersister.java:862)
at
cirrus.hibernate.impl.ScheduledUpdate.execute(ScheduledUpdate.java:21)
at
cirrus.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:1721)
at cirrus.hibernate.impl.SessionImpl.flush(SessionImpl.java:1701)
at
cirrus.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1057)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:836)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:824)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:816)
Why would that happen?
Then, I added session.suspendFlushes() before the queries. It generated the
following 9 SQLs:
Hibernate: SELECT staff.id, staff.staffid, staff.firstname,
staff.middleinitial, staff.lastname, staff.privilege_level FROM staff staff
Hibernate: SELECT age.id, age.addressee_group_owner_id,
age.addressee_group_entry_id, age.staff_id FROM addressee_group_entry age
Hibernate: SELECT addressee_group0.id AS id,
addressee_group0.description AS description FROM addressee_group
addressee_group0 WHERE addressee_group0.id = ?
Hibernate: SELECT y.id, y.addressee_group_owner_id,
y.addressee_group_entry_id, y.staff_id FROM addressee_group_entry y,
addressee_group x WHERE x.id = y.addressee_group_owner_id AND (x.id=? )
Hibernate: SELECT addressee_group0.id AS id,
addressee_group0.description AS description FROM addressee_group
addressee_group0 WHERE addressee_group0.id = ?
Hibernate: SELECT y.id, y.addressee_group_owner_id,
y.addressee_group_entry_id, y.staff_id FROM addressee_group_entry y,
addressee_group x WHERE x.id = y.addressee_group_owner_id AND (x.id=? )
Hibernate: select id from addressee_group_entry where
addressee_group_owner_id = ?
Hibernate: select id from addressee_group_entry where
addressee_group_owner_id = ?
Hibernate: SELECT ag.id, ag.description FROM addressee_group ag
Then I commented out the first two finds and suspendFlushes, so I now have
just this:
List groups = dao.currentSession.find("from ag in class
AddresseeGroup");
And I get the following 9 slightly different SQLs:
Hibernate: SELECT ag.id, ag.description FROM addressee_group ag
Hibernate: SELECT y.id, y.addressee_group_owner_id,
y.addressee_group_entry_id, y.staff_id FROM addressee_group_entry y,
addressee_group x WHERE x.id = y.addressee_group_owner_id AND (x.id=? )
Hibernate: SELECT staff0.id AS id, staff0.staffid AS staffid,
staff0.firstname AS firstname, staff0.middleinitial AS middleinitial,
staff0.lastname AS lastname, staff0.privilege_level AS privilege_level FROM
staff staff0 WHERE staff0.id = ?
Hibernate: SELECT staff0.id AS id, staff0.staffid AS staffid,
staff0.firstname AS firstname, staff0.middleinitial AS middleinitial,
staff0.lastname AS lastname, staff0.privilege_level AS privilege_level FROM
staff staff0 WHERE staff0.id = ?
Hibernate: SELECT staff0.id AS id, staff0.staffid AS staffid,
staff0.firstname AS firstname, staff0.middleinitial AS middleinitial,
staff0.lastname AS lastname, staff0.privilege_level AS privilege_level FROM
staff staff0 WHERE staff0.id = ?
Hibernate: SELECT addressee_group0.id AS id,
addressee_group0.description AS description FROM addressee_group
addressee_group0 WHERE addressee_group0.id = ?
Hibernate: SELECT y.id, y.addressee_group_owner_id,
y.addressee_group_entry_id, y.staff_id FROM addressee_group_entry y,
addressee_group x WHERE x.id = y.addressee_group_owner_id AND (x.id=? )
Hibernate: select id from addressee_group_entry where
addressee_group_owner_id = ?
Hibernate: select id from addressee_group_entry where
addressee_group_owner_id = ?
Is this what I should expect? Is there other settings I need to make?
Thanks,
John
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Hibernate-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hibernate-devel