I am having trouble with getting some caching to work with hibernate exactly the way I would like. I created some example code to replicate this problem I am having.
I have one object that contains instances of itself. For instance, a Part that is made up of more Parts. I really need to minimize the select statements that Hibernate is using when an updated object comes in. After going through the logs, I see this log output that is causing a SELECT statement: Cached item was locked: com.cache.dataobject.Part.parts#1 What can I change in my annotation mappings, xml files, or logic to keep the cached item from being locked? I would really like to get rid of that select statement. I included the Entity, DataObject, code I am testing with, and log output. Hibernate version: 3.4 EHCache Version: 1.2.3 (Included with Hibernate Download) Part DataObject package com.cache.dataobject; | | import java.io.Serializable; | import java.lang.String; | import java.util.List; | | import javax.persistence.*; | | import org.hibernate.annotations.Cache; | import org.hibernate.annotations.CacheConcurrencyStrategy; | | import static javax.persistence.CascadeType.ALL; | | /** | * Entity implementation class for Entity: Part | * | */ | @Entity | @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) | public class Part implements Serializable { | | private int id; | private String name; | private static final long serialVersionUID = 1L; | private Part mainPart; | private List<Part> parts; | | public Part() { | super(); | } | | @Id | public int getId() { | return this.id; | } | | public void setId(int id) { | this.id = id; | } | | @Column(name = "PART_NAME") | public String getName() { | return this.name; | } | | public void setName(String name) { | this.name = name; | } | | @ManyToOne(cascade = ALL) | public Part getMainPart() { | return mainPart; | } | | public void setMainPart(Part mainPart) { | this.mainPart = mainPart; | } | | @OneToMany(cascade = ALL) | @JoinColumn(name = "mainPart_id", referencedColumnName = "id") | @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) | public List<Part> getParts() { | return parts; | } | | public void setParts(List<Part> parts) { | this.parts = parts; | } | | } CacheDao package com.cache.dao; | | import java.util.List; | | import javax.ejb.Stateless; | import javax.persistence.EntityManager; | import javax.persistence.PersistenceContext; | import javax.persistence.Query; | | import com.cache.dataobject.Part; | | /** | * Session Bean implementation class CacheDao | */ | @Stateless(mappedName = "ejb/CacheDao") | public class CacheDao implements CacheDaoRemote { | | @PersistenceContext(unitName="CacheProjectUnit") | EntityManager em; | | /** | * Default constructor. | */ | public CacheDao() { | // TODO Auto-generated constructor stub | } | | public Part addPart(Part part){ | System.out.println("CALLED PERSIST"); | em.persist(part); | return part; | } | | public Part updatePart(Part part){ | System.out.println("CALLED MERGE"); | em.merge(part); | return part; | } | | } Test Client Code | package com.cache.dao; | | import java.util.ArrayList; | import java.util.List; | | import javax.naming.InitialContext; | import javax.naming.NamingException; | | import com.cache.dao.CacheDaoRemote; | import com.cache.dataobject.Part; | | | public class test { | | /** | * @param args | */ | public static void main(String[] args) { | InitialContext ctx; | try { | ctx = new InitialContext(); | CacheDaoRemote dao = (CacheDaoRemote) ctx.lookup("ejb/CacheDao"); | Part computer = new Part(); | computer.setId(1); | computer.setName("Computer"); | | List<Part> parts = new ArrayList<Part>(); | | Part cpu = new Part(); | cpu.setId(2); | cpu.setName("CPU"); | | Part monitor = new Part(); | monitor.setId(3); | monitor.setName("Monitor"); | | parts.add(cpu); | parts.add(monitor); | | computer.setParts(parts); | | dao.addPart(computer); | | computer.setName("DellComputer"); | | dao.updatePart(computer); | | | } catch (NamingException e) { | // TODO Auto-generated catch block | e.printStackTrace(); | } | | } | | } | Persistence.xml <?xml version="1.0" encoding="UTF-8"?> | <persistence version="1.0" | xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> | <persistence-unit name="CacheProjectUnit"> | <provider>org.hibernate.ejb.HibernatePersistence</provider> | <!-- JNDI name of the database resource to use --> | <jta-data-source>jdbc/H2Pool</jta-data-source> | <properties> | <!-- The database dialect to use --> | <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> | <!-- drop and create tables at deployment --> | <property name="hibernate.hbm2ddl.auto" value="create-drop" /> | <property name="hibernate.max_fetch_depth" value="3" /> | <!-- Hibernate Query Language (HQL) parser. --> | <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" /> | </properties> | </persistence-unit> | </persistence> EhCache.xml <ehcache> | <diskStore path="java.io.tmpdir"/> | | <defaultCache | maxElementsInMemory="10000" | eternal="false" | timeToIdleSeconds="120" | timeToLiveSeconds="120" | overflowToDisk="true" | diskPersistent="false" | diskExpiryThreadIntervalSeconds="120" | memoryStoreEvictionPolicy="LRU" | /> | | | <cache name = "com.cache.dataobject.Part" | maxElementsInMemory="100000" | eternal="true" | diskPersistent="false" | timeToIdleSeconds="0" | timeToLiveSeconds="0" | /> | | | <cache name = "com.cache.dataobject.Part.parts" | maxElementsInMemory="100000" | eternal="true" | diskPersistent="false" | timeToIdleSeconds="0" | timeToLiveSeconds="0" | /> | | | </ehcache> Output Log: INFO: CALLED PERSIST FINEST: Cache lookup: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINE: Element for com.cache.dataobject.Part#1 is null FINEST: Cache miss: com.cache.dataobject.Part#1 FINEST: Cache lookup: com.cache.dataobject.Part#2 FINE: key: com.cache.dataobject.Part#2 FINE: Element for com.cache.dataobject.Part#2 is null FINEST: Cache miss: com.cache.dataobject.Part#2 FINEST: Cache lookup: com.cache.dataobject.Part#3 FINE: key: com.cache.dataobject.Part#3 FINE: Element for com.cache.dataobject.Part#3 is null FINEST: Cache miss: com.cache.dataobject.Part#3 FINEST: Invalidating: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 FINE: Element for com.cache.dataobject.Part.parts#1 is null FINE: insert into Part (mainPart_id, PART_NAME, id) values (?, ?, ?) FINE: insert into Part (mainPart_id, PART_NAME, id) values (?, ?, ?) FINE: insert into Part (mainPart_id, PART_NAME, id) values (?, ?, ?) FINE: update Part set mainPart_id=? where id=? FINE: update Part set mainPart_id=? where id=? FINEST: Inserting: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINE: Element for com.cache.dataobject.Part#1 is null FINEST: Inserted: com.cache.dataobject.Part#1 FINEST: Inserting: com.cache.dataobject.Part#2 FINE: key: com.cache.dataobject.Part#2 FINE: Element for com.cache.dataobject.Part#2 is null FINEST: Inserted: com.cache.dataobject.Part#2 FINEST: Inserting: com.cache.dataobject.Part#3 FINE: key: com.cache.dataobject.Part#3 FINE: Element for com.cache.dataobject.Part#3 is null FINEST: Inserted: com.cache.dataobject.Part#3 FINEST: Releasing: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 INFO: CALLED MERGE FINEST: Cache lookup: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINEST: Cache hit: com.cache.dataobject.Part#1 FINEST: Cache lookup: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINEST: Cache hit: com.cache.dataobject.Part#1 FINEST: Cache lookup: com.cache.dataobject.Part#2 FINE: key: com.cache.dataobject.Part#2 FINEST: Cache hit: com.cache.dataobject.Part#2 FINEST: Cache lookup: com.cache.dataobject.Part#2 FINE: key: com.cache.dataobject.Part#2 FINEST: Cache hit: com.cache.dataobject.Part#2 FINEST: Cache lookup: com.cache.dataobject.Part#3 FINE: key: com.cache.dataobject.Part#3 FINEST: Cache hit: com.cache.dataobject.Part#3 FINEST: Cache lookup: com.cache.dataobject.Part#3 FINE: key: com.cache.dataobject.Part#3 FINEST: Cache hit: com.cache.dataobject.Part#3 FINEST: Cache lookup: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 FINEST: Cached item was locked: com.cache.dataobject.Part.parts#1 FINE: select parts0_.mainPart_id as mainPart3_1_, parts0_.id as id1_, parts0_.id as id18_0_, parts0_.mainPart_id as mainPart3_18_0_, parts0_.PART_NAME as PART2_18_0_ from Part parts0_ where parts0_.mainPart_id=? FINEST: Caching: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 FINEST: Cached: com.cache.dataobject.Part.parts#1 FINEST: Invalidating: com.cache.dataobject.Part.parts#2 FINE: key: com.cache.dataobject.Part.parts#2 FINE: Element for com.cache.dataobject.Part.parts#2 is null FINEST: Invalidating: com.cache.dataobject.Part.parts#3 FINE: key: com.cache.dataobject.Part.parts#3 FINE: Element for com.cache.dataobject.Part.parts#3 is null FINEST: Invalidating: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 FINEST: Invalidating: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINE: update Part set mainPart_id=?, PART_NAME=? where id=? FINE: update Part set mainPart_id=null where mainPart_id=? FINE: update Part set mainPart_id=null where mainPart_id=? FINEST: Updating: com.cache.dataobject.Part#1 FINE: key: com.cache.dataobject.Part#1 FINEST: Updated: com.cache.dataobject.Part#1 FINEST: Releasing: com.cache.dataobject.Part.parts#2 FINE: key: com.cache.dataobject.Part.parts#2 FINEST: Releasing: com.cache.dataobject.Part.parts#3 FINE: key: com.cache.dataobject.Part.parts#3 FINEST: Releasing: com.cache.dataobject.Part.parts#1 FINE: key: com.cache.dataobject.Part.parts#1 View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4218103#4218103 Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4218103 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user