青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

brent's hut

關于Hibernate的記錄

我和hibernate的第一次親密:

我用的數據庫是mssql,用middlegen稀里嘩啦生成一堆文件。編譯運行,hibernate報告一堆異常,大概是說,MSSQL JDBC抗議說他不能讀取已經讀過的字段,所以hibernate不能生成需要的collection。最后icepeak傳給我一個JSQLConnect,終于把這個問題解決了。

設置hibernate生成定制的主鍵ID

在和hibernate親密接觸之后,我想按照自己的想法來設計組織機構.對于Organ,Department,Post和Stuff.我希望這樣設計主鍵的ID,類型都是char,格式為:
Organ0000000001
Dept0000000001
Post0000000001
Stuff0000000002

修改middlegen產生的.hbm.xml文件:

......
<class
??? name="com.abcdefg.hibernate.Organ"
??? table="Organ"
>
??? <id
??????? name="organId"
??????? type="java.lang.String"
??????? column="OrganId"
??? >
??????? <generator class="hbtest.PkGenerator">
??????????? <param name="table">PKGenerator_table</param>
??????????? <param name="column">NextOrganId</param>
??????????? <param name="max_lo">0</param>
?</generator>
??? </id>
......
</class>

找到的資料說:"如果需要采用定制的主鍵產生算法,則在此處配置主鍵生成器,主鍵生成器必須實現net.sf.hibernate.id.IdentifierGenerator 接口".我找了半天都沒找到net.sf.hibernate.id.IdentifierGenerator.其實只要從hibernate自身提供的一些主鍵生成器繼承就可以,從hibernate的源文件可以看到這些主鍵生成器實現的接口是org.hibernate.id

我的PkGenerator.java文件:
package hbtest;

import org.hibernate.id.TableHiLoGenerator;
import java.io.Serializable;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.type.Type;
import org.hibernate.type.IntegerType;
import org.hibernate.util.PropertiesHelper;

public class PkGenerator
??? extends TableHiLoGenerator {

? private String columnName;

? public void configure(Type type, Properties params, Dialect d) {
??? super.configure(new IntegerType(), params, d);
??? this.columnName = PropertiesHelper.getString(COLUMN, params,
???????????????????????????????????????????????? DEFAULT_COLUMN_NAME);
? }

? public synchronized Serializable generate(SessionImplementor session,
??????????????????????????????????????????? Object obj) throws
????? HibernateException {
??? Object result = super.generate(session, obj);
??? String strNumber = result.toString();
??? StringBuffer strResult = new StringBuffer("");
??? if (columnName.compareToIgnoreCase("NextOrganId") == 0) {
????? strResult.append("Organ");
??? }
??? else if(columnName.compareToIgnoreCase("NextDeptId") == 0){
????? strResult.append("Dept");
??? }
??? ......

??? if (strNumber.length() > 10)
????? throw new HibernateException("The generated " + strResult +
?????????????????????????????????? "Id is too long!");
??? else if (strNumber.length() == 10) {
????? strResult.append(strNumber);
??? }
??? else {
??????? int count = 10 - strNumber.length();
??????? while (count > 0) {
??????? strResult.append("0");
??????? count--;
????? }
????? strResult.append(strNumber);
??? }
??? return strResult.toString();
? }
}

實現了以后發現在這些主鍵前面添加"Organ","Dept"之類的并不是特別有用,而且我開始的出發點還是錯的.也許我應該建立更多的映射表...?

Hibernate的初級指南

hibernate貼心的地方

驗證了一下,我的擔心終于被證實是多余的了,我擔心的是hibernate會為同一條記錄產生一堆不同的對象。
我覺得使hibernate真正實用的條件:為同一條記錄產生的多個對象是同一個對象。當然前提是設置了主鍵。
hibernate也許是將當前讀出的對象保存在一個哈希表,在讀一個新對象的時候會先從這個哈希表中查找。好像這并不是多困難的事情。
?
但多線程情況下就有所不同了..
因為Hibernate說(對于Session):
It is not intended that implementors be threadsafe. Instead each thread/transaction should obtain its own instance from a SessionFactory
?
Session并沒有要求是線程安全的,而通過實驗表明記錄和對象的一一對應只存在于同一個Session中。這也是hibernate的文檔中HibernateUtil類使用ThreadLocal的原因吧。
所以對于多線程的情況,在不同的線程中,對應同一條記錄的對象是不同的。

(另hibernate有二級緩存,是全局的緩存,可以用來減少數據庫負載,二級緩存的功能需要設置才會啟用)

Hibernate中修改多對多關系的屬性:

<middlegen>項中有如下<table>配置:
?? <table generate="true" name="Post"/>
?? <table generate="true" name="Stuff"/>
?? <many2many>
????? <tablea generate="true" name="Post" />
????? <jointable name="PostStuff" generate="true" />
????? <tableb generate="true" name="Stuff" />
?? </many2many>
即表Post與Stuff的關系是多對多,而且表PostStuff中一個字段時JoinDate:員工加入部門的時間。

我現在想加入一條Post記錄,一條Stuff記錄,然后設置Stuff加入Post的時間。經過多次嘗試,代碼如下:
?? ...
?? Dept dept = ....
?? Post post = new Post("third post1",dept,new HashSet(),new HashSet());
?? Stuff stuff = new Stuff("third stuff",new HashSet(),new HashSet());
?? session.save(stuff);
?? session.save(post);
?? post.getStuffs().add(stuff);
?? //stuff.getPosts().add(post);/*不能與上一行并存,會有異常,因為是一個死循環?*/
?? PostStuff postStuff = (PostStuff)session.createQuery("from PostStuff where PostId = '" + post.getPostId() + "' AND StuffId = '" + stuff.getStuffId() + "'").iterate().next();
?? postStuff.setJoinDate(new java.util.Date());
?? tx.commit();
?? HibernateUtil.closeSession();
?? ...

post.getStuffs().add(stuff);在兩個Save()之后,而且沒有調用session.flush(),但是createQuery能夠得到PostStuff說明HQL是先從內存中查詢數據的。不需要調用session.flush()來寫入數據庫,因為tx.commit()會自動調用。

可以用session.persist(stuff)來替換session.save(stuff),我暈,明明save有說明會創建id,而persist沒有說明會創建id的(但實際上是創建了)。

試圖用以下替代post.getStuffs().add(stuff):
?? PostStuff postStuff = new PostStuff();
?? postStuff.setPost(post);
?? postStuff.setStuff(stuff);
?? postStuff.setJoinDate(new java.util.Date());
?? postStuff.setComp_id(new PostStuffPK(post.getPostId(),stuff.getStuffId()));
?? post.getPostStuffs().add(postStuff);
結果是雖然沒有異常,但并不會添加一條關系。

或者

?? session.flush();
?? session.refresh(stuff);
?? ((PostStuff)(stuff.getPostStuffs().iterator().next())).setJoinDate(new java.util.Date());
注意這些代碼只是用來作試驗用的

posted on 2005-12-19 09:23 brent 閱讀(544) 評論(0)  編輯 收藏 引用 所屬分類: Java

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲毛片在线看| 亚洲精品视频在线| 国产老肥熟一区二区三区| 国产偷国产偷亚洲高清97cao | 亚洲国产精品免费| 91久久久久久久久久久久久| 久久国产日本精品| 国产精品成人久久久久| 最新亚洲视频| 久久久久综合网| 亚洲国产精品久久久久秋霞不卡| 久久精品免视看| 99在线精品视频在线观看| 嫩模写真一区二区三区三州| 国产一区二区三区黄视频| 在线观看日韩av电影| 久久精品1区| 亚洲摸下面视频| 国产精品国产三级国产aⅴ9色| 亚洲毛片一区| 亚洲成人在线网站| 欧美激情一区二区三区在线视频观看 | 国产在线乱码一区二区三区| 亚洲欧美日韩一区在线| 亚洲美女精品成人在线视频| 男人天堂欧美日韩| 国产农村妇女精品一二区| 欧美一区二区三区视频免费播放 | 日韩视频在线播放| 麻豆九一精品爱看视频在线观看免费 | 国产精品视频999| 亚洲欧美在线一区二区| 免费在线观看成人av| 久久成人精品一区二区三区| 国产午夜精品一区二区三区视频 | 欧美日韩国产精品一区二区亚洲| 99精品国产99久久久久久福利| 欧美激情免费观看| 欧美精品www在线观看| 日韩视频一区二区在线观看| 亚洲精品日韩在线| 欧美天堂亚洲电影院在线播放 | 免费成人高清在线视频| 欧美精品激情在线| 亚洲高清视频的网址| 麻豆视频一区二区| 欧美精品1区2区| 亚洲在线日韩| 欧美亚洲一区二区在线观看| 国产日韩欧美91| 欧美大色视频| 国产精品黄色| 欧美福利电影在线观看| 欧美色视频一区| 久久免费视频网站| 欧美性感一类影片在线播放| 美日韩精品视频| 国产精品久久看| 欧美激情亚洲精品| 国产欧美1区2区3区| 亚洲激情小视频| 国产精品中文字幕在线观看| 亚洲高清自拍| 国产一区二区三区精品欧美日韩一区二区三区 | 在线免费观看日本欧美| 亚洲视频电影图片偷拍一区| 亚洲人成人一区二区在线观看| 亚洲一区二区三区欧美| 99riav1国产精品视频| 久久久久国色av免费观看性色| 国产精品99久久久久久久久| 久久夜色精品国产| 久久午夜视频| 国产主播精品| 性做久久久久久久免费看| 欧美亚洲综合久久| 欧美高清视频在线播放| 免费在线观看日韩欧美| 国产在线播精品第三| 久久久xxx| 尤物精品在线| 久久精品官网| 久久精品天堂| 国产亚洲毛片| 欧美一级理论性理论a| 欧美一区二区视频免费观看| 欧美色图一区二区三区| 亚洲另类春色国产| 一本色道久久综合亚洲精品按摩| 久久综合九色九九| 欧美高清视频在线| 亚洲国产导航| 欧美精品一区二区三区一线天视频 | 亚洲一区二区高清| 亚洲一级在线观看| 欧美视频免费在线观看| 亚洲精品一二区| 在线亚洲免费视频| 国产精品国产三级国产专播品爱网 | 99亚洲精品| 欧美日韩在线播放三区四区| 日韩午夜av| 亚洲在线视频| 国模叶桐国产精品一区| 欧美成ee人免费视频| 亚洲日产国产精品| 欧美色一级片| 午夜精品福利视频| 欧美成人69| 亚洲网站在线观看| 国产欧美韩国高清| 久久综合九色综合久99| 欧美激情精品久久久久久变态| 99精品视频网| 国产精品一区免费在线观看| 午夜久久电影网| 女女同性精品视频| 一本一本久久a久久精品牛牛影视| 欧美日韩亚洲系列| 亚洲专区一区二区三区| 欧美成人激情在线| 亚洲午夜激情网站| 国产一区二区三区久久| 嫩草影视亚洲| 亚洲欧美成人网| 欧美α欧美αv大片| 亚洲一二区在线| 一区二区亚洲| 欧美日韩在线高清| 玖玖玖免费嫩草在线影院一区| 亚洲精品中文字幕在线观看| 久久久国产亚洲精品| 99在线精品观看| 国产亚洲欧美日韩美女| 欧美连裤袜在线视频| 久久福利电影| 亚洲无亚洲人成网站77777| 模特精品在线| 亚洲欧美日韩区| 亚洲国产欧美不卡在线观看| 国产精品亚洲片夜色在线| 久久精品中文字幕一区| 欧美a级在线| 亚洲私人黄色宅男| 欧美激情视频在线播放 | 亚洲福利视频专区| 欧美日韩另类在线| 久久综合影音| 欧美一区视频在线| av成人手机在线| 亚洲国产视频一区二区| 欧美在线视频观看| 亚洲一区二区三区视频播放| 亚洲高清色综合| 国产一区二区日韩| 国产精品日韩精品欧美精品| 欧美日本精品一区二区三区| 久久嫩草精品久久久精品一| 欧美一区二区高清| 亚洲欧美在线另类| 亚洲综合精品一区二区| 亚洲色在线视频| 夜夜精品视频| 一区二区三区.www| 一区二区欧美在线观看| 日韩午夜电影| 一区二区高清| 99视频一区二区| 久久久免费av| 欧美一区二区三区免费观看| 亚洲香蕉成视频在线观看| 亚洲久久一区| 亚洲韩国一区二区三区| 玉米视频成人免费看| 国产综合网站| 一区二区三区在线看| 国内精品一区二区三区| 国产亚洲欧美激情| 国产综合精品| 狠狠色噜噜狠狠色综合久| 激情亚洲一区二区三区四区| 国内久久精品| 亚洲第一福利在线观看| 伊人久久大香线蕉综合热线| 一色屋精品视频在线看| 在线观看三级视频欧美| ●精品国产综合乱码久久久久| 影音先锋中文字幕一区| 亚洲国产精品成人va在线观看| 亚洲成人直播| 夜夜狂射影院欧美极品| 亚洲欧美国产一区二区三区| 香蕉久久夜色精品国产| 久久国产精品网站| 亚洲精品久久久蜜桃| 久久中文精品| 久热精品视频| 一区二区三区高清| 欧美高清视频在线观看| 亚洲一区二区三区在线视频|