Hullo,
I'm having a problem with modifying child collections that are declared with the DELETE_ORPHAN cascade type. When I do a clear() on the collection, it complains with an UnsupportedOperationException (see below for stack trace). I noticed that the HbmBinder calls Collection.setOrphanDelete when the delete-orphan element is specified, but AnnotationBinder does no such thing (that I can see). That hasOrphanDelete property plays an important role in determining whether a clear() is queued or not. I tried setting this property to true through the debugger and found that everything worked correctly as a result.
So, is the fact that AnnotationBinder doesn't call setOrphanDelete a bug (if so I'll log a JIRA), or is there a good reason why it doesn't (and perhaps I'm doing something wrong?).
Thanks,
Ben
Hibernate version: 3.1 rc 1 with annotations 3.1beta6
Mapping documents:
Code:
@Entity
@Proxy(lazy=false)
public class Price extends BusinessObject {
@OneToMany(mappedBy="price", cascade=CascadeType.ALL)
@OrderBy(clause="priceRuleId")
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
public Set<PriceRule> getRules() {
return rules;
}
...
}
Code between sessionFactory.openSession() and session.close():
price.getRules().clear();
session.flush();
Note: price is connected to the session
Full stack trace of any exception that occurs:
Caused by: java.lang.UnsupportedOperationException: queued clear cannot be used with orphan delete
at org.hibernate.collection.PersistentSet$Clear.getOrphan(PersistentSet.java:375)
at org.hibernate.collection.AbstractPersistentCollection.getQueuedOrphans(AbstractPersistentCollection.java:515)
at org.hibernate.engine.Cascade.deleteOrphans(Cascade.java:341)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:318)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:130)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:121)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:877)
at org.springframework.orm.hibernate3.HibernateTemplate$27.doInHibernate(HibernateTemplate.java:713)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:312)
at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:711)