一对多,懒加载,能使用二级缓存吗

qad 2009-11-05 04:37:57
ApplicationContext.xml:
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>


hcache.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="java.io.tmpdir" />
<defaultCache
maxElementsInMemory="10000"
eternal="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU" />
</ehcache>



userdb,用户表:
popedom,权限表:
一对多,懒加载
<hibernate-mapping>
<class name="com.zjm.books.pojo.Userdb" table="userdb">
<cache usage="read-only"/>
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="codedb" class="com.zjm.books.pojo.Codedb" lazy="false" fetch="join">
<column name="sex" not-null="true" />
</many-to-one>
<property name="username" type="java.lang.String">
<column name="username" length="50" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="50" not-null="true" />
</property>
<property name="pname" type="java.lang.String">
<column name="pname" length="50" not-null="true" />
</property>
<property name="flag" type="java.lang.String">
<column name="flag" length="5" not-null="true" />
</property>
<set name="popedoms" inverse="true" lazy="false" cascade="all">
<key>
<column name="userid" not-null="true" />
</key>
<one-to-many class="com.zjm.books.pojo.Popedom" />
</set>
</class>
</hibernate-mapping>




<hibernate-mapping>
<class name="com.zjm.books.pojo.Popedom" table="popedom">
<cache usage="read-only"/>
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="tree" class="com.zjm.books.pojo.Tree" lazy="false" fetch="join">
<column name="childID" not-null="true" />
</many-to-one>
<many-to-one name="userdb" class="com.zjm.books.pojo.Userdb" fetch="select">
<column name="userid" not-null="true" />
</many-to-one>
<property name="comment" type="java.lang.String">
<column name="comment" length="100" />
</property>
</class>
</hibernate-mapping>



我设置了<cache usage="read-only"/>,可是多次查询userdb用户表时,还是执行了多次sql查询语句,应该只查一次才对啊
这种情况能使用二级缓存吗
...全文
184 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
deng1234 2009-11-10
  • 打赏
  • 举报
回复
最好不要配one-to-many,直接写hql.和写sql一样写。要那些字段查那些字段。
我一般这样搞。
qad 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 warison2008 的回复:]
String queryString = "from popedom";
getHibernateTemplate().setCacheQueries(true);
return getHibernateTemplate().find(queryString);
[/Quote]

popedom的数据是通过懒加载出来的,没有String queryString = "from popedom";语句
        <set name="popedoms" inverse="true" lazy="false" cascade="all">
<key>
<column name="userid" not-null="true" />
</key>
<one-to-many class="com.zjm.books.pojo.Popedom" />
</set>
zl3450341 2009-11-09
  • 打赏
  • 举报
回复
帮顶下
道光2008 2009-11-09
  • 打赏
  • 举报
回复
String queryString = "from popedom";
getHibernateTemplate().setCacheQueries(true);
return getHibernateTemplate().find(queryString);
qad 2009-11-08
  • 打赏
  • 举报
回复
有没有人能回答一下
道光2008 2009-11-06
  • 打赏
  • 举报
回复
.setCacheable(true)
不设置这个当然不能使用查询缓存啊
qad 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 warison2008 的回复:]
.setCacheable(true)
不设置这个当然不能使用查询缓存啊
[/Quote]

现在问题就在这,popedom表,是通过懒加载查出来的,.setCacheable(true)这句往哪写啊?
qad 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 warison2008 的回复:]
Query q=s.createQuery("From Resources r") 
.setCacheable(true)
这里有没有设置查询使用二级缓存?
[/Quote]


String queryString = "from Userdb";
getHibernateTemplate().setCacheQueries(true);
return getHibernateTemplate().find(queryString);


查询userdb的代码,有setCacheable(true)
popedom是通过懒加载方式,没有明确的查询代码,没法设置setCacheable(true)吧,现在每次都重新查询popedom的数据
道光2008 2009-11-05
  • 打赏
  • 举报
回复
Query q=s.createQuery("From Resources r")
.setCacheable(true)
这里有没有设置查询使用二级缓存?
道光2008 2009-11-05
  • 打赏
  • 举报
回复
lazy(一级缓存)和二级缓存没关系

楼主把你的测试代码贴出来看看
dinghun8leech 2009-11-05
  • 打赏
  • 举报
回复
哦,补充一下,应该是一级缓存。二级缓存指的是SessionFactory,是全局性的,Session是一级缓存,有效期随session开启关闭而定,当楼主查询一个记录时会有一个oid被保存到一级缓存,当楼主再次查询这个记录时将会根据oid自动找到缓存中的数据,因此上述两个查询操作只查询一次数据库,只有一条sql产生。
dinghun8leech 2009-11-05
  • 打赏
  • 举报
回复
二级缓存是放置曾经查过的pojo对象的地方,懒加载是指在事务提交之前没有被直接访问到的关联对象不会被加载,只会给一个代理类。因此我觉得二级缓存和懒加载好像不存在什么关联。
开启事务
使用lazy
未访问:不加载,访问:加载
不使用lazy
未访问与访问均加载
关闭事务并且使用lazy时访问未被加载的关联对象时将抛出异常。

欢迎楼下找错。
qad 2009-11-05
  • 打赏
  • 举报
回复
查询userdb的语句,就执行一次,说明二级缓存起作用
可是懒加载的popedom表数据,还是每次都执行sql查询
youjianbo_han_87 2009-11-05
  • 打赏
  • 举报
回复
去看下缓存的定义。。。。。。。。。。。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧