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

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>
            欧美一级午夜免费电影| 一本色道精品久久一区二区三区| 欧美怡红院视频一区二区三区| 亚洲午夜精品一区二区| 国产精品免费小视频| 欧美在线观看天堂一区二区三区| 欧美在线观看你懂的| 亚洲高清在线播放| 亚洲伦理久久| 国产精品入口尤物| 久久影视精品| 欧美精品啪啪| 午夜一区不卡| 免费成人在线视频网站| 亚洲视频免费在线| 久久蜜桃av一区精品变态类天堂| 亚洲开发第一视频在线播放| 一二三四社区欧美黄| 国产丝袜美腿一区二区三区| 亚洲大胆av| 国产精品久久久久久久久久久久久| 久久gogo国模裸体人体| 欧美大片91| 久久爱www.| 欧美日本久久| 久久久亚洲人| 国产精品成人aaaaa网站| 国产精品免费一区豆花| 美女久久一区| 国产欧美二区| 日韩视频免费观看高清在线视频 | 一区二区三区高清不卡| 国产一区二区三区免费观看| 亚洲精品中文在线| 红桃视频国产一区| 亚洲一区二区久久| aaa亚洲精品一二三区| 久久精品一区蜜桃臀影院| 一区二区三区视频在线看| 久久人人97超碰精品888| 午夜精品久久久久久久99樱桃 | 在线观看av一区| 亚洲一区二区三区激情| 99精品视频免费| 欧美成人激情视频免费观看| 久久免费国产精品| 国产亚洲aⅴaaaaaa毛片| 在线亚洲欧美视频| 一区二区三区成人| 欧美国产亚洲另类动漫| 免费在线国产精品| 狠狠色狠色综合曰曰| 亚洲直播在线一区| 亚洲欧美在线一区二区| 欧美日韩综合视频| 99热在这里有精品免费| 亚洲区一区二区三区| 久久综合久久久久88| 蜜桃精品久久久久久久免费影院| 国产午夜精品美女视频明星a级| 亚洲制服丝袜在线| 欧美专区在线| 国产夜色精品一区二区av| 亚洲影院高清在线| 新狼窝色av性久久久久久| 国产精品日韩在线播放| 亚洲欧美日韩精品一区二区 | 亚洲三级观看| 欧美日韩国产一级片| 亚洲精品一区二区在线| 亚洲一区二区三区在线| 国产精品美女xx| 欧美在线3区| 欧美成黄导航| 亚洲精选视频免费看| 欧美精品一区在线发布| 日韩写真在线| 欧美专区日韩视频| 亚洲国产精品久久久| 欧美人成在线| 亚洲欧美日韩国产成人| 老司机午夜精品视频| 最近中文字幕mv在线一区二区三区四区| 麻豆乱码国产一区二区三区| 亚洲韩国一区二区三区| 午夜精品区一区二区三| 狠狠色丁香久久综合频道| 欧美成人黑人xx视频免费观看| 亚洲精品影院| 久久伊人精品天天| 欧美日韩精品系列| 欧美一级淫片aaaaaaa视频| 蜜臀va亚洲va欧美va天堂 | 国产精品国产三级国产普通话蜜臀| 亚洲欧美日韩成人高清在线一区| 男人的天堂亚洲在线| av不卡免费看| 激情亚洲一区二区三区四区| 欧美激情一区二区三区蜜桃视频 | 亚洲国产99| 国产精品大片wwwwww| 久久综合伊人77777| 一本久久综合亚洲鲁鲁五月天| 久久精品国产精品亚洲| 亚洲每日更新| 精品不卡在线| 国产精品免费一区豆花| 欧美国产一区二区| 香蕉av777xxx色综合一区| 亚洲经典视频在线观看| 久久久精品一区二区三区| 亚洲天堂网站在线观看视频| 亚洲电影欧美电影有声小说| 国产欧美日韩综合精品二区| 欧美日本韩国一区| 久热精品视频在线观看一区| 亚洲欧美日韩国产成人| 99国产精品久久久久久久成人热| 美女网站久久| 久久久999精品视频| 午夜一区二区三区不卡视频| 一区二区三区导航| 日韩一级精品视频在线观看| 伊甸园精品99久久久久久| 国产精品久久久免费 | 这里是久久伊人| 日韩天堂在线视频| 亚洲黄页一区| 欧美大学生性色视频| 老色鬼精品视频在线观看播放| 欧美一区永久视频免费观看| 亚洲女人天堂成人av在线| av成人免费在线| 亚洲毛片av在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久最新视频| 久久久久一区二区三区| 欧美专区18| 久久久噜噜噜久久中文字免| 久久精品亚洲热| 久久香蕉国产线看观看av| 久久久99精品免费观看不卡| 久久精品国产清自在天天线 | 一区二区三区欧美在线观看| 日韩亚洲欧美精品| 亚洲最新在线视频| 一区二区三区产品免费精品久久75 | 国产精品美女在线观看| 国产精品女人毛片| 国产精品午夜电影| 国产九九精品视频| 韩国av一区| 尤物精品在线| 亚洲日韩欧美视频一区| 亚洲精品国产无天堂网2021| 一本色道久久88综合亚洲精品ⅰ| 亚洲视频中文| 久久黄色网页| 亚洲国产精品va在看黑人| 亚洲人成人77777线观看| 99re6热只有精品免费观看| 夜夜躁日日躁狠狠久久88av| 亚洲男同1069视频| 久久久久久夜| 欧美日韩国产91| 国产三区二区一区久久| 在线成人国产| 亚洲视频axxx| 久久免费视频一区| 亚洲精品中文字幕在线| 亚洲一区二区在线免费观看| 久久久精品国产99久久精品芒果| 欧美精品一区二区高清在线观看| 国产精品大全| 亚洲欧洲日产国产综合网| 亚洲亚洲精品三区日韩精品在线视频 | 99一区二区| 久久成人资源| 亚洲人精品午夜| 午夜久久黄色| 欧美日韩1区2区| 国产曰批免费观看久久久| 99re6这里只有精品| 欧美一区视频| 亚洲精品四区| 久久影院午夜论| 国产精品日韩欧美一区| 亚洲欧洲精品一区二区| 香蕉av福利精品导航| 91久久综合| 麻豆久久婷婷| 国内精品模特av私拍在线观看| 亚洲午夜视频| 亚洲欧洲精品一区二区三区| 欧美诱惑福利视频| 国产精品视频观看| 亚洲视频一区二区| 亚洲日本欧美在线| 欧美大片在线观看一区| ●精品国产综合乱码久久久久|