1、緩存:緩存是什麼,解決什麼問題?
位於速度相差較大的兩種硬件/軟件之間的,用於協調兩者數據傳輸速度差異的結構,均可稱之爲 Cache(摘自Robbin的《緩存技術淺談》)。目的:讓數據更接近於應用程序,協調速度不匹配,使訪問速度更快。(請參考http://baike.baidu.com/view/907.htm 瞭解更多緩存知識)
高速緩存不屬於Hibernate等,屬於獨立產品或框架,可單獨使用。
常見緩存算法:
a) LFU(Least Frequently Used):最近不常被使用(命中率低),一定時間段內使用次數最少的
b) LRU(Least Recently Used):最近很少使用(LinkedHashMap),沒有被使用時間最長的
c) FIFO(First In First Out):先進先出
2、緩存策略
1.對象緩存
2.查詢緩存
3.頁面緩存
1.動態頁面緩存
2.Servlet緩存
3.頁面片段緩存
3、緩存分類
1. Web緩存:
i. 瀏覽器緩存:ajax(在客戶端緩存)、HTTP協議
ii. 代理服務器緩存
2. 操作系統緩存:如用於減少磁盤操作
3. 數據庫緩存:
i. 結果緩存:
ii. 排序緩存
iii. 插入緩存
iv. 日誌緩存
v. ………………
4. 應用程序緩存
i. 對象緩存
ii. 查詢緩存
iii. 頁面緩存
1. 動態頁面靜態化:網頁靜態化、獨立圖片服務器
2. 頁面局部緩存:
3. 請求迴應緩存:
4、常見Java緩存框架
§ EHCache
§ OSCache
§ JBossCache
§ SwarmCache
5、通用緩存產品
§ Memcached:在大規模互聯網應用下使用,可用於分佈式環境,每秒支撐1.5萬~2萬次請求
§ Tokyo Tyrant:兼容memcached協議,可以持久化存儲,支持故障切換,對緩存服務器有高可靠性要求可以使用,每秒支撐0.5萬~0.8萬次請求
6、基於Web應用的緩存應用場景:
(摘自bluedavy的《大型網站架構演化》)
8、緩存實戰:
8.4、ORM緩存
8.4.1、目的:
Hibernate緩存:使當前數據庫狀態的表示接近應用程序,要麼在內存中,要麼在應用程序服務器機器的磁盤上。高速緩存是數據的一個本地副本,處於應用程序和數據庫之間,可用來避免數據庫的命中。
8.4.2、避免數據庫命中:
應用程序根據標識符到緩存查,有就返回,沒有再去數據庫.
8.4.3、ORM緩存分類
一級緩存、二級緩存
8.4.4、緩存範圍
1、事務範圍高速緩存,對應於一級緩存(單Session)
2、過程(JVM)範圍高速緩存,對應於二級緩存(單SessionFactory)
3、集羣範圍高速緩存,對應於二級緩存(多SessionFactory)
8.4.5、緩存哪些數據
1、很少改變的數據;
2、不重要的數據,如論壇帖子,無需實時的數據;
3、應用程序固有的而非共享的。
4、讀大於寫有用
8.4.6、Hibernate緩存架構
圖摘自《Hibernate in Action》
§ Hibernate中的二級緩存是可插拔的。
§ Hibernate二級緩存支持對象緩存、集合緩存、查詢結果集緩存,對於查詢結果集緩存可選。
§ 查詢緩存:需要兩個額外的物理高速緩存區域:一個用於存放查詢的結果集;另一個用於存儲表上次更新的時間戳
8.4.6.2、高速緩存實戰(ehcache)
8.4.6.2.1、全局配置(hibernate.cfg.xml)
Java代碼 收藏代碼
<!-- 開啓二級緩存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 開啓查詢緩存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 二級緩存區域名的前綴 -->
<!--<property name="hibernate.cache.region_prefix">h3test</property>-->
<!-- 高速緩存提供程序 -->
<property name="hibernate.cache.region.factory_class">
net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>
<!-- 指定緩存配置文件位置 -->
<property name="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml
</property>
<!-- 強制Hibernate以更人性化的格式將數據存入二級緩存 -->
<property name="hibernate.cache.use_structured_entries">true</property>
<!-- Hibernate將收集有助於性能調節的統計數據 -->
<property name="hibernate.generate_statistics">true</property>
8.4.6.2.2、ehcache配置(ehcache.xml)
Java代碼 收藏代碼
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="h3test">
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</defaultCache>
</ehcache>
8.4.6.2.3、實體只讀緩存
1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並只讀
Java代碼 收藏代碼
<hibernate-mapping>
<class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">
<cache usage="read-only"/>
……
</hibernate-mapping>
2、測試代碼
Java代碼 收藏代碼
public static void readonlyTest() {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session1 = sf.openSession();
Transaction t1 = session1.beginTransaction();
//確保數據庫中有標識符爲1的FarmModel
FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);
//如果修改將報錯,只讀緩存不允許修改
//farm.setName("aaa");
t1.commit();
session1.close();
Session session2 = sf.openSession();
Transaction t2 = session2.beginTransaction();
farm = (FarmModel) session2.get(FarmModel.class, 1);
t2.commit();
session2.close();
sf.close();
}
§ 只讀緩存不允許更新,將報錯Can't write to a readonly object。
§ 允許新增,(現在2。0 新增直接添加到二級緩存)
8.4.6.2.4、實體非嚴格讀/寫緩存
1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並非嚴格讀/寫
Java代碼 收藏代碼
<hibernate-mapping>
<class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">
<cache usage="nonstrict-read-write"/>
……
</hibernate-mapping>
2、測試代碼
Java代碼 收藏代碼
public static void nonstrictReadWriteTest () {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session1 = sf.openSession();
Transaction t1 = session1.beginTransaction();
//確保數據庫中有標識符爲1的FarmModel
FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);
t1.commit();
session1.close();
Session session2 = sf.openSession();
Transaction t2 = session2.beginTransaction();
farm = (FarmModel) session2.get(FarmModel.class, 1);
t2.commit();
session2.close();
sf.close();
}
§ 允許更新,更新後緩存失效,需再查詢一次。
§ 允許新增,新增記錄自動加到二級緩存中。
§ 整個過程不加鎖,不保證。
8.4.6.2.5、實體讀/寫緩存
1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼 收藏代碼
<hibernate-mapping>
<class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">
<cache usage="read-write"/>
……
</hibernate-mapping>
2、測試代碼
Java代碼 收藏代碼
public static void readWriteTest() {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session1 = sf.openSession();
Transaction t1 = session1.beginTransaction();
//確保數據庫中有標識符爲1的FarmModel
FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);
farm.setName("as");
t1.commit();
session1.close();
Session session2 = sf.openSession();
Transaction t2 = session2.beginTransaction();
farm = (FarmModel) session2.get(FarmModel.class, 1);
t2.commit();
session2.close();
sf.close();
}
§ 允許更新,更新後自動同步到緩存。
§ 允許新增,新增記錄後自動同步到緩存。
§ 保證read committed隔離級別及可重複讀隔離級別(通過時間戳實現)
§ 整個過程加鎖,如果當前事務的時間戳早於二級緩存中的條目的時間戳,說明該條目已經被別的事務修改了,此時重新查詢一次數據庫,否則才使用緩存數據,因此保證可重複讀隔離級別。
8.4.6.2.6、實體事務緩存
需要特定緩存的支持和JTA事務支持,此處不演示。
8.4.6.2.7、集合緩存
此處演示讀/寫緩存示例,其他自測
1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼 收藏代碼
<hibernate-mapping>
<class name="cn.javass.h3test.model.UserModel" table="TBL_USER">
<cache usage="read-write" />
<set name="farms" cascade="all" inverse="true" lazy="false">
<cache usage="read-write"/>
<key column="fk_user_id"/>
<one-to-many class="cn.javass.h3test.model.FarmModel"/>
</set>
</class>
</hibernate-mapping>
2、測試代碼
Java代碼 收藏代碼
public static void collectionReadWriteTest() {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session1 = sf.openSession();
Transaction t1 = session1.beginTransaction();
//確保數據庫中有標識符爲118的UserModel
UserModel user = (UserModel) session1.get(UserModel.class, 118);
user.getFarms();
t1.commit();
session1.close();
Session session2 = sf.openSession();
Transaction t2 = session2.beginTransaction();
user = (UserModel) session2.get(UserModel.class, 118);
user.getFarms();
t2.commit();
session2.close();
sf.close();
}
§ 和實體併發策略有相同含義;
§ 但集合緩存只緩存集合元素的標識符,在二級緩存中只存放相應實體的標識符,然後再通過標識符去二級緩存查找相應的實體最後組合爲集合返回。
8.4.6.2.8、查詢緩存
1、保證全局配置中有開啓了查詢緩存。
2、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼 收藏代碼
<hibernate-mapping>
<class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">
<cache usage="read-write"/>
……
</hibernate-mapping>
3、測試代碼
Java代碼 收藏代碼
public static void queryCacheTest() {
SessionFactory sf =
new Configuration().configure().buildSessionFactory();
Session session1 = sf.openSession();
Transaction t1 = session1.beginTransaction();
Query query = session1.createQuery("from FarmModel");
//即使全局打開了查詢緩存,此處也是必須的
query.setCacheable(true);
List<FarmModel> farmList = query.list();
t1.commit();
session1.close();
Session session2 = sf.openSession();
Transaction t2 = session2.beginTransaction();
query = session2.createQuery("from FarmModel");
//即使全局打開了查詢緩存,此處也是必須的
query.setCacheable(true);
farmList = query.list();
t2.commit();
session2.close();
sf.close();
}
§ 和實體併發策略有相同含義;
§ 和集合緩存類似,只緩存集合元素的標識符,在二級緩存中只存放相應實體的標識符,然後再通過標識符 去二級緩存查找相應的實體最後組合爲集合返回。
8.4.6.2.9、高速緩存區域
Hibernate在不同的高速緩存區域保存不同的類(實體)/集合,如果不配置區域默認都保存到“默認緩存”(defaultCache)中。
每一個區域可以設置過期策略、緩存條目大小等等。
對於類緩存,默認區域名是全限定類名,如cn.javass.h3test.model.UserModel。
對於集合而言,默認區域名是全限定類名+屬性名,如cn.javass.….UserModel.farms。
可通過hibernate.cache.region_prefix指定特定SessionFactory的區域前綴,如前綴是h3test,則如類緩存的區域名就是h3test. cn.javass.h3test.model.UserModel。如果應用程序使用多個SessionFactory 這可能是必須的。
可通過<cache usage="read-write" region="區域名"/>自定義區域名,不過默認其實就可以了。
8.4.6.2.10、ehcache配置詳解:
1、默認cache:如果沒有對應的特定區域的緩存,就使用默認緩存。
Java代碼 收藏代碼
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</defaultCache>
2、指定區域cache:通過name指定,name對應到Hibernate中的區域名即可。
Java代碼 收藏代碼
<cache name="cn.javass.h3test.model.UserModel"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</cache>
3、cache參數詳解:
name:指定區域名
maxElementsInMemory :緩存在內存中的最大數目
maxElementsOnDisk:緩存在磁盤上的最大數目
eternal :緩存是否持久
overflowToDisk : 硬盤溢出數目
timeToIdleSeconds :當緩存條目閒置n秒後銷燬
timeToLiveSeconds :當緩存條目存活n秒後銷燬
memoryStoreEvictionPolicy:緩存算法,有LRU(默認)、LFU、FIFO
4、StandardQueryCache
用於查詢緩存使用,如果指定了該緩存,那麼查詢緩存將放在該緩存中。
Java代碼 收藏代碼
<cache
name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="5"
eternal="false"
timeToLiveSeconds="120"
overflowToDisk="true"/>
如果不給查詢設置區域名默認緩存到這,可以通過“query.setCacheRegion("區域名");”來設置查詢的區域名。
5、UpdateTimestampsCache
時間戳緩存,內部使用,用於保存最近更新的表的時間戳,這是非常重要的,無需失效,關閉時間戳緩存區域的過期時間。
Java代碼 收藏代碼
<cache
name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
overflowToDisk="true"/>
Hibernate使用時間戳區域來決定被高速緩存的查詢結果集是否是失效的。當你重新執行了一個啓用了高速緩存的查詢時,Hibernate就在時間戳緩存中查找對被查詢的(幾張)表所做的最近插入、更新或刪除的時間戳。如果找到的時間戳晚於高速緩存查詢結果的時間戳,那麼緩存結果將被丟棄,重新執行一次查詢。
8.4.6.2.11、什麼時候需要查詢緩存
大多數時候無法從結果集高速緩存獲益。必須知道:每隔多久重複執行同一查詢。
對於那些查詢非常多但插入、刪除、更新非常少的應用程序來說,查詢緩存可提升性能。但寫入多查詢少的沒有用,總失效。
8.4.6.2.12、管理一級緩存
無論何時,當你給save()、update()或 saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。
當隨後flush()方法被調用時,對象的狀態會和數據庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理內存時,你可以調用evict() 方法,從一級緩存中去掉這些對象及其集合。
ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
Cat cat = (Cat) cats.get(0);
doSomethingWithACat(cat);
sess.evict(cat);
}
Session還提供了一個contains()方法,用來判斷某個實例是否處於當前session的緩存中。
如若要把所有的對象從session緩存中徹底清除,則需要調用Session.clear()。
CacheMode參數用於控制具體的Session如何與二級緩存進行交互。
CacheMode.NORMAL - 從二級緩存中讀、寫數據。
CacheMode.GET - 從二級緩存中讀取數據,僅在數據更新時對二級緩存寫數據。
CacheMode.PUT - 僅向二級緩存寫數據,但不從二級緩存中讀數據。
CacheMode.REFRESH - 僅向二級緩存寫數據,但不從二級緩存中讀數據。通過 hibernate.cache.use_minimal_puts的設置,強制二級緩存從數據庫中讀取數據,刷新緩存內容。
8.4.6.2.12、管理二級緩存
對於二級緩存來說,在SessionFactory中定義了許多方法, 清除緩存中實例、整個類、集合實例或者整個集合。
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
sessionFactory.evictQueries()//evict all queries
8.4.6.2.13、監控二級緩存
如若需要查看二級緩存或查詢緩存區域的內容,你可以使用統計(Statistics) API。
通過sessionFactory.getStatistics();獲取Hibernate統計信息。
此時,你必須手工打開統計選項。
hibernate.generate_statistics true
hibernate.cache.use_structured_entries true
具體詳見“hibernate監控.rar”(需要自己稍微改改才能用)
需要修改head.jsp中的如下代碼獲取sessionFactory
Java代碼 收藏代碼
if(sessionFactory == null) {
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
sessionFactory = (SessionFactory)applicationContext.getBean("userSessionFactory");
}
參考資料:
Robbin的《緩存技術淺談》
百度百科的高速緩存知識 http://baike.baidu.com/view/907.htm
bluedavy的《大型網站架構演化》(http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html)
《Hibernate in Action》
hibernate監控.rar (10.7 KB)
下載次數: 448
查看圖片附件
45
頂
8
踩
分享到:
評估你的代碼 | Hibernate 關係映射 總結整理
2012-05-13 07:50
瀏覽 27406
評論(33)
分類:企業架構
相關推薦
參考知識庫
Java EE知識庫 16791 關注 | 1265 收錄
評論
33 樓 寒冰lyl 2014-09-03
32 樓 在世界的中心呼喚愛 2014-01-26
不是很喜歡這類文章,很多配置。。
這類文章,我也只有在項目使用到纔會去看看。。。
前面的概念很好,又複習了一遍。
31 樓 tanxiangbo 2014-01-26
log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender.
Hibernate:
select
bo.*,
p.code as productCode,
p.name as productName,
p.norm as norm ,
(case
when bo.channelId is not null then (select
name
from
t_sel_channel c
where
c.id=bo.channelId)
else ''
end) as channelName ,
(case
when bo.customerId is not null then (select
name
from
t_ba_customer bc
where
bc.id=bo.customerId)
else ''
end) as customerName
from
( select
b.product_id as productId ,
sum(b.num) as borrowNum,
sum(b.writeoffs_num) as writeoffsNum,
sum(b.return_num) as returnNum ,
sum(b.num)-sum(case
when b.writeoffs_num is null then 0
else b.writeoffs_num
end)-sum(case
when b.return_num is null then 0
else b.return_num
end) as num ,
b.borrower_id as borrowerId,
b.borrower_name as borrowerName,
b.whs_id as whsId,
b.whs_name as whsName,
b.channel_id as channelId,
b.customer_id as customerId
from
t_whs_borrow_details as b
where
1=1
and b.whs_id in(
?, ?, ?
)
group by
b.product_id,
b.borrower_id,
b.whs_id
order by
b.stamp desc )as bo
left join
t_sel_product p
on p.id=bo.productId
java.lang.IllegalStateException: aliases expected length is 0; actual length is 16
張哥幫忙看看是什麼原因?
30 樓 jacking124 2014-01-14
jinnianshilongnian 寫道
jacking124 寫道
張哥,我打開二級查詢緩存的時候,
Java代碼 收藏代碼
Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)
.setMaxResults(MaxResults);
// 打開查詢緩存
query.setCacheable(true);
spList = query.list();
的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!
你的query貼下 是不是有問題
謝謝,張哥,問題解決的了,就是Query的問題!!
29 樓 kkrgwbj 2014-01-14
在嗎?想請教你個問題.clob類型不能放入二級緩存中.請問有解決方法嗎?
28 樓 jinnianshilongnian 2014-01-10
jacking124 寫道
張哥,我打開二級查詢緩存的時候,
Java代碼 收藏代碼
Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)
.setMaxResults(MaxResults);
// 打開查詢緩存
query.setCacheable(true);
spList = query.list();
的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!
你的query貼下 是不是有問題
27 樓 jacking124 2014-01-10
張哥,我打開二級查詢緩存的時候,
Java代碼 收藏代碼
Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)
.setMaxResults(MaxResults);
// 打開查詢緩存
query.setCacheable(true);
spList = query.list();
的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!
26 樓 jinnianshilongnian 2013-06-07
愛吃小雪生 寫道
樓主請問下 我按照你寫的這種方式使用二級緩存 好像是用起了,第二次list查詢不會有sql,但是不管怎麼弄 我使用 System.out.println(sf.getStatistics().getSecondLevelCacheHitCount()); 查詢緩存命中次數的時候都爲0 這是什麼原因?而且數據量10w以上的時候比不用緩存還慢 謝謝 求聯繫 [email protected]
估計你沒有開啓二級緩存監控
hibernate.generate_statistics=true
可以參考
https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-config.xml
https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/resources.properties
25 樓 愛吃小雪生 2013-06-07
樓主請問下 我按照你寫的這種方式使用二級緩存 好像是用起了,第二次list查詢不會有sql,但是不管怎麼弄 我使用 System.out.println(sf.getStatistics().getSecondLevelCacheHitCount()); 查詢緩存命中次數的時候都爲0 這是什麼原因?而且數據量10w以上的時候比不用緩存還慢 謝謝 求聯繫 [email protected]
24 樓 jinnianshilongnian 2013-01-23
yeahwell 寫道
你好,我想請問你一下,你使用hibernate4.1.2和ehcache2.4.3配置成功了嗎?在配置文件中,hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory,這個應該使用什麼,我使用org.hibernate.cache.ehcache.EhCacheRegionFactory也不行。求指導
請參考
http://jinnianshilongnian.iteye.com/blog/1423971
23 樓 yeahwell 2013-01-22
你好,我想請問你一下,你使用hibernate4.1.2和ehcache2.4.3配置成功了嗎?在配置文件中,hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory,這個應該使用什麼,我使用org.hibernate.cache.ehcache.EhCacheRegionFactory也不行。求指導
22 樓 xujinnan 2012-11-05
受益匪淺!博主能不能寫篇有關延時加載的文章供大家學習一下呢?
21 樓 jinnianshilongnian 2012-07-31
lucky16 寫道
你好,博主。
看了你的博客,覺得你應該對SSH瞭解的比較透徹,
所以想請教一下,你碰見過在SSH環境下動態添加domain的字段的情況嗎?
要求不重啓服務器,在web端添加後就可以使用的。
有什麼好點的解決方案嗎?
爲什麼要這麼做? 在人少的時候重啓不就可以了。
一般服務器都會有reload功能,一般通過重新創建classloader完成,老的classloader不會釋放,因此很容易內存溢出。
建議在人少時通過重啓解決
20 樓 lucky16 2012-07-31
你好,博主。
看了你的博客,覺得你應該對SSH瞭解的比較透徹,
所以想請教一下,你碰見過在SSH環境下動態添加domain的字段的情況嗎?
要求不重啓服務器,在web端添加後就可以使用的。
有什麼好點的解決方案嗎?
19 樓 jinnianshilongnian 2012-05-16
421584397 寫道
http://www.verydemo.com/demo/53/70/10571
這裏有關於hibernate聯級對象緩存文章,寫得不錯
謝謝 我也看看
18 樓 421584397 2012-05-15
http://www.verydemo.com/demo/53/70/10571
這裏有關於hibernate聯級對象緩存文章,寫得不錯
17 樓 jeffsui 2012-05-15
3樓,用get方式獲得的對象,對應了對象的持久化狀態。
16 樓 jinnianshilongnian 2012-05-14
stevenjohn 寫道
stevenjohn 寫道
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
你用list 會有問題的 主鍵遞增 如100的話 那麼集合就需要100個空間 浪費啊
這個indexs不是主鍵
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`indexs` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一個普通的字段。
還有是不是不推薦使用list,在one-to-many的情況下?
indexes不需要是索引,,,它映射到list 只是作爲索引,,list 在 index比較小而且不重複時可以用用 不過場景我沒遇到過
15 樓 stevenjohn 2012-05-14
stevenjohn 寫道
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
你用list 會有問題的 主鍵遞增 如100的話 那麼集合就需要100個空間 浪費啊
這個indexs不是主鍵
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`indexs` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一個普通的字段。
還有是不是不推薦使用list,在one-to-many的情況下?
14 樓 stevenjohn 2012-05-14
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset" lazy="true" >
<key>
<column name="questionid"></column>
</key>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</set>
<list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
<key>
<column name="questionid"></column>
</key>
<index >
<column name="indexs"></column>
</index>
<one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
</list >
那麼
<index >
<column name="indexs"></column>
</index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。
你用list 會有問題的 主鍵遞增 如100的話 那麼集合就需要100個空間 浪費啊
這個indexs不是主鍵
CREATE TABLE `employee` (
`eid` varchar(36) NOT NULL,
`ename` varchar(50) NOT NULL,
`did` varchar(36) NOT NULL,
`idx` int(11) NOT NULL,
PRIMARY KEY (`eid`),
KEY `FK4722E6AEFEA415DC` (`did`),
CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
CREATE TABLE `department` (
`did` varchar(36) NOT NULL,
`dname` varchar(50) NOT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
只是一個普通的字段。
還有是不是不推薦使用list,在one-to-many的情況下?