i'm using TreeCache as the 2nd level cache with these 3 beans, which form a one-many-one relation:
Car | | @Entity | @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) | | @Entity(optimisticLock = OptimisticLockType.VERSION) | @Table(name = "CAR") | | public class Car extends BaseEntity implements java.io.Serializable { | | private List<FaxToCar> faxes; | | ..... | | @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "car") | @Cascade(value=CascadeType.DELETE_ORPHAN) | @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) | public List<FaxToCar> getFaxes() { | return faxes; | } | | .... | | @Transient | public String getFaxNameList() { | List<FaxToCar> l = getFaxes(); | String s = ""; | for (FaxToCar car2 : l) { | if (s.length() > 0) { | s += ", "; | } | s += car2.getFax().getName(); | } | return s; | } | } | FaxToCar | | @Entity | @Entity(optimisticLock = OptimisticLockType.VERSION) | @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) | | @Table(name = "FAX2CAR") | | public class FaxToCar extends BaseEntity implements java.io.Serializable { | | | | | protected int seq; | | private Car car; | | private Fax fax; | | @ManyToOne(fetch = FetchType.LAZY) | @JoinColumn(name = "car_id") | public Car getCar() { | return car; | } | | | public void setCar(Car car) { | this.car = car; | } | | @ManyToOne(fetch = FetchType.LAZY) | @JoinColumn(name = "fax_id") | public Fax getFax() { | return fax; | } | | | public void setFax(Fax fax) { | this.fax = fax; | } | | | public int getSeq() { | return seq; | } | | | public void setSeq(int seq) { | this.seq = seq; | } | | } | | | Fax | @Entity | @Entity(optimisticLock = OptimisticLockType.VERSION) | @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) | | @Table(name = "FAX") | | public class Fax extends BaseEntity implements java.io.Serializable { | | private List<FaxToCar> cars; | | ... | | @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "fax") | @Cascade(value=CascadeType.DELETE_ORPHAN) | @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) | @OrderBy("seq") | public List<FaxToCar> getCars() { | return cars; | } | ... | | After i deleted a "Fax", everything works as expected, unless i acces a "Car" which was previously cached, becasue it looks like its cached collection of "FaxToCar" references a now not longer instance of "Fax2Car", which was deleted because of "CascadeType.DELETE_ORPHAN". The stacktrace looks like this: anonymous wrote : 10:54:22,171 INFO [STDOUT] Hibernate: select car0_.id as id12_, car0_.version as version12_, car0_.createdBy as createdBy12_, car0_.updatedBy as updatedBy12_, | car0_.createdTime as createdT5_12_, car0_.updatedTime as updatedT6_12_, car0_.gf as gf12_, car0_.typ as typ12_, car0_.hersteller as hersteller12_, car0_.lack a | lack12_, car0_.lack_code as lack11_12_, car0_.polster as polster12_, car0_.polster_code as polster13_12_, car0_.ez as ez12_, car0_.angebotspreis as angebot15_ | 2_, car0_.vorbesitzer as vorbesi16_12_, car0_.km as km12_, car0_.neupreis as neupreis12_, car0_.behobenerschaden as behoben19_12_, car0_.differenzbesteuert as | iffere20_12_, car0_.verkauft as verkauft12_, car0_.freitext as freitext12_ from CAR car0_ where 1=1 and (car0_.gf like ?) | 10:54:22,452 INFO [STDOUT] Hibernate: select faxtocar0_.id as id18_0_, faxtocar0_.version as version18_0_, faxtocar0_.createdBy as createdBy18_0_, faxtocar0_. | pdatedBy as updatedBy18_0_, faxtocar0_.createdTime as createdT5_18_0_, faxtocar0_.updatedTime as updatedT6_18_0_, faxtocar0_.car_id as car8_18_0_, faxtocar0_.f | x_id as fax9_18_0_, faxtocar0_.seq as seq18_0_ from FAX2CAR faxtocar0_ where faxtocar0_.id=? | 10:54:22,452 INFO [DefaultLoadEventListener] Error performing load command | org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [de.foobar.hfax.entity.fax.FaxToCar#27908] | at org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27) | at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:128) | at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177) | at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87) | at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:891) | at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:859) | at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266) | at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:177) | at org.hibernate.collection.PersistentBag.initializeFromCache(PersistentBag.java:140) | at org.hibernate.cache.entry.CollectionCacheEntry.assemble(CollectionCacheEntry.java:35) | at org.hibernate.event.def.DefaultInitializeCollectionEventListener.initializeCollectionFromCache(DefaultInitializeCollectionEventListener.java:130) | at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:48) | at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1695) | at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344) | at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86) | at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:246) | at de.foobar.hfax.entity.core.Car.getFaxNameList(Car.java:269) | ..... As a workaround, i'm manually evicting the offending collection out of the cache: public void removeFax(Fax fax) { | manager.remove(fax); | manager.flush(); | Session hs = ((HibernateSession)manager).getHibernateSession(); | hs.getSessionFactory().evictCollection("de.foobar.hfax.entity.core.Car.faxes"); | } Question: Bug or Feature ? TIA Marco View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3933049#3933049 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3933049 ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ JBoss-user mailing list JBoss-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jboss-user