當前位置:首頁 » 編程語言 » hibernate原生sql返回
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hibernate原生sql返回

發布時間: 2022-05-27 23:19:34

A. Hibernate中CriteriaQuery可以使用原生sql作為排序條件么

Hibernate對原生SQL查詢的支持和控制是通過SQLQuery介面實現的,這種方式彌補了HQL、Criterion查詢的不足,在操作和使用上往往更加的自由和靈活,如果使用得當,資料庫操作的效率還會得到不同程度的提升。

Hibernate對原生
SQL查詢的支持和控制是通過SQLQuery介面實現的。通過Session介面,我們能夠很方便的創建一個SQLQuery(SQLQuery是一個介面,在Hibernate4.2.2之前,默認返回的是SQLQuery的實現類——SQLQueryImpl對象,在下文中出現的SQLQuery如非註明,都是指該子類)對象來進行原生SQL查詢:

session.createSQLQuery(String sql);

SQLQuery實現了Query介面,因此你可以使用Query介面中提供的API來獲取數據。

最簡單的示例

//獲取所有查詢結果
session.createSQLQuery("select * from note").list();
//僅獲取第一條結果
session.createSQLQuery("select * from note where id = 1").uniqueResult();

使用預處理SQL

預處理SQL的好處自然不必多說,除了眾所周知的能夠防止SQL注入攻擊外,還能夠在一定程度上提高SQL的查詢效率。SQLQuery提供了眾多的介面來分別設置不同類型的參數,諸如setBigDecimal、setBinary、setDouble等,詳參SQLQuery的JavaDoc,此處不再贅述。這里僅重點說一下通用的SQL參數設置介面setParameter。

如下代碼示範了如何使用SQLQuery執行預處理SQL:

SQLQuery query = session.createSQLQuery("select * from note where id = ?");
//設置第一個參數的值為12,即查詢ID=12的note
query.setParameter(0, 12);
List list = query.list();
...

這里需要註明一點,無論是通過不同類型參數的設置介面來設置SQL參數,還是通過setParameter來設置參數,下標都是從0開始的,而不是從1開始的!

使用自定義的結果轉換器處理查詢結果

SQLQuery
介面預留了setResultTransformer介面以實現使用用戶自定義的ResultTransformer結果集轉換器處理查詢結果。
ResultTransformer介面非常簡單,只有兩個方法,分別用來轉換單行數據和所有結果數據。經過自定義ResultTransformer生成的實體,並未加入Session,因此是非受管實體。

如下代碼,示範了如何將單行數據裝入LinkedHashMap對象中:

query.setResultTransformer(new ResultTransformer() {

@Override
public Object transformTuple(Object[] values, String[] columns) {
Map<String, Object> map = new LinkedHashMap<String, Object>(1);
int i = 0;
for(String column : columns){
map.put(column, values[i++]);
}
return map;
}

@Override
public List transformList(List list) {
return list;
}
});

如果不設置自定義的ResultTransformer轉換器,則Hibernate將每行返回結果的數據按照結果列的順序裝入Object數組中。

這里介紹一個工具類:Transformers,它提供了一些常用的轉換器,能夠幫助我們快速轉換結果集,如Transformers.aliasToBean(Note.class)能夠將查詢結果依別名注入到Note實體中。

使用標量

使用SQLQuery執行原生SQL時,Hibernate會使用ResultSetMetadata來判定返回的標量值的實際順序和類型。如果要避免過多的使用ResultSetMetadata,或者只是為了更加明確的指名返回值,可以使用addScalar()。

session.createSQLQuery("select * from note where id = 1")
.addScalar("id", LongType.INSTANCE)
.addScalar("name", StringType.INSTANCE)
.addScalar("createtime", DateType.INSTANCE);

這個查詢指定了SQL查詢字元串,要返回的欄位和類型.它仍然會返回Object數組,但是此時不再使用ResultSetMetdata,而是明確的將id,name和
createtime按照Long,
String和Date類型從resultset中取出。同時,也指明了就算query是使用*來查詢的,可能獲得超過列出的這三個欄位,也僅僅會返回這三個欄位。

對全部或者部分的標量值不設置類型信息也是可以的:

session.createSQLQuery("select * from note where id = 1")
.addScalar("id")
.addScalar("name")
.addScalar("createtime", DateType.INSTANCE);

沒有被指定類型的欄位將仍然使用ResultSetMetdata獲取其類型。注意,欄位不區分大小寫,同時不能夠指定不存在的欄位!

關於從ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate類型,是由方言(Dialect)控制的。假若某個指定的類型沒有被映射,或者不是你所預期的類型,你可以通過Dialet的registerHibernateType調用自行定義。

如果僅指定了一個scalar,那麼...

Date createTime = (Date)session.createSQLQuery("select * from note where id = 1")
.addScalar("createtime", DateType.INSTANCE)
.uniqueResult();

如果我們的SQL語句使用了聚合函數,如count、max、min、avg等,且返回結果僅一個欄位,那麼Hibernate提供的這種提取標量結果的方式就非常便捷了。

實體查詢

上面的查詢都是返回標量值的,也就是從resultset中返回的「裸」數據。下面展示如何通過addEntity()讓原生查詢返回實體對象。

session.createSQLQuery("select * from note where id = 1").addEntity(Note.class);
session.createSQLQuery("select id,name,createtime from note where id = 1").addEntity(Note.class);

這個查詢指定SQL查詢字元串,要返回的實體。假設Note被映射為擁有id,name和createtime三個欄位的類,以上的兩個查詢都返回一個List,每個元素都是一個Note實體。

假若實體在映射時有一個many-to-one的關聯指向另外一個實體,在查詢時必須也返回那個實體,否則會導致發生一個"column
not found"的資料庫錯誤。這些附加的欄位可以使用*標注來自動返回,但我們希望還是明確指明,看下面這個具有指向Dog的many-to-one的例子:

session.createSQLQuery("select id,note,createtime,author from note where id = ?").addEntity(Note.class);

author欄位即為Note實體和Author實體的關聯欄位,只需在查詢時得到該欄位的值,Hibernate即可使用該值找到對應的關聯實體。如上例中,note.getAuthor()即可返回當前Note所屬的Author對象。

處理關聯和集合類

通過提前抓取將Author連接獲得,而避免初始化proxy帶來的額外開銷也是可能的。這是通過addJoin()方法進行的,這個方法可以讓你將關聯或集合連接進來。

session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");

上面的例子是多對一的關聯查詢,反過來做一對多的關聯查詢也是可以的。如下的例子中,author.notes表示該用戶發表的所有日記(Note),Set集合類型:

session.createSQLQuery("select {author.*},{note.*} from note note, user author where author.id = ? and note.author = author.id")
.addEntity("author", User.class)
.addJoin("note", "author.notes");

注意:join查詢會在每行返回多個實體對象,處理時需要注意。

別名和屬性引用

假若SQL查詢連接了多個表,同一個欄位名可能在多個表中出現多次,這會導致SQL錯誤。不過在我們可以通過使用佔位符來完美地解決這一問題。

其實在上例中已經用到了佔位符:

session.createSQLQuery("select {note.*}, {author.*} from note note, user author where note.author = author.id")
.addEntity("note", Note.class)
.addJoin("author", "note.author");

這個查詢指明SQL查詢語句,其中包含佔位附來讓Hibernate注入欄位別名,查詢並返回的實體。

上面使用的{note.*}和{author.*}標記是作為「所有屬性」的簡寫形式出現的,當然你也可以明確地羅列出欄位名。但如下的範例代碼中我們讓Hibernate來為每個屬性注入SQL欄位別名,欄位別名的佔位符是表別名
+ . + 屬性名。

注意:屬性名區分大小寫,而且不能夠在where子句中使用佔位符。

SQLQuery query = session.createSQLQuery("select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id");
query.addEntity("note", Note.class);
query.addJoin("author", "note.author");

大多數情況下,上面的別名注入方式可以滿足需要,但在使用更加復雜的映射,比如復合屬性、通過標識符構造繼承樹,以及集合類等等情況下,則需要更加復雜的別名注入方式。

下表列出了使用別名注射參數的不同方式:

B. 如何將hibernate 原生sql查詢的結果獲取出來

Session session = sf.openSession();
session.beginTransaction();
SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);
List<Category> categories = (List<Category>)q.list();
for(Category c : categories) {
System.out.println(c.getName());
}

C. java hibernate 原生sql查詢。

//原生sql查詢可以使用createSQLQuery(String sql)方法 下面代碼表示查詢所有的用戶
List<User> users=session.createSQLQuery("select * from user").list();

D. hibernate 中 createSQLQuery() 用法,我想讓它返回一個book對象,怎麼寫語句。

看上去,你的寫法應該沒啥問題。
不過這個b又不是佔位符,你又是單表的查詢,是不是應該把b去掉啊。
SQLQuery sqlquery = s.createSQLQuery("select * from Book b where b.name = bookName").addEntity(Book.class);

參考:http://hi..com/liheng666/blog/item/6b38d3c472d271a08226aca7.html

E. hibernate原生sql查詢單列返回的是什麼

其實是沒有具體的返回的,執行的結果是org.hibernate.impl.SQLQueryImpl,根據你對返回結果的邏輯來決定你返回的類型,比如java.util.List,調用它的list()方法,調用iterater方法則返回java.util.Iterator.返回String則調用SQLQueryImpl的父類AbstractQueryImpl的getQueryString()....

F. [極品難]關於hibernate如何把原生sql查出的結果轉化為對象

例如我們有一個照片的POJava code//照片poclass Photo{int id;string title;
double avgScore;//平均分,這個欄位在資料庫中是沒有映射的,也就是 非持久化屬性}//投票po ,每張照片對應多個vote記錄class Vote{int id;int photoId;int score;}用sql = "select {p.*,avg(v.score) as p.avgScore} from photo p left join vote v on p.id = v.photoId ";
單純的sql結果很滿意,包含照片的信息和每張照片的平均分數。
代碼如下:Query query = session.createSQLQuery(sql.toString()).addEntity(Photo.class);
運行後,沒有錯誤,但是在SQL語句中的avg(v.score) as p.avgScore} 這一部分,沒有被像我們預期的那樣set進photo的avgScore屬性中。
問題:我們如果遇到要用原生sql進行查詢,並要將結果set進一個po中,其中set進po中的屬性,不完全是被可持久化的,例如本例
中的avgScore屬性。
PS: 請別和我說完全可以用hql等方式,這只是個簡單的示例,目前是想研究原生sql對象映射問題。
我仔細看了那篇文章,addScalar這個的意思似乎只是把查出來的非屬性結果進行類型綁定,我現在的困惑是如果把這個值自動綁定進po中~~
就像上面的例子,select出一個po,然後這個po中要有那個avgScore的屬性值,目前我試過即使用addScalar明確avgScore的類型,還是不會自動set進po中。。
列印出的SQL:
sql: select {p.id,p.user_id,p.url,p.state,avg(v.score) as p.avgScore} from photos p where p.user_id = :userId and p.state in ( 0, 1 ) group by p.id order by p.id desc
報了個這個錯:
44187 [http-8080-1] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
44187 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
2009-9-3 12:04:39 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet default threw exception
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p where p.user_id = 13 and p.state in ( 0, 1 ) group by p.id orde' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
如果不加{}那麼就報在資料庫找不到p.avgScore這列,因為p.avgScore是一個虛似的臨時變數,非持久化屬性。
我提問題時只是簡單寫的示例,省略了幾個欄位,
sql = "select p.id,avg(v.score) from photo p , vote v where p.id = v.photoId group by p.id";
這么寫是可以,但不會被自動綁定進PO,我來問就是想知道在不調用SET方法的情況下能否自動把非欄位屬性綁定進PO。
您看看有沒有自動的方式綁定進PO的。。
因為我返回avg(v.score) as p.avgScore,其實在p這個po中是有setAvgScore()這個方法的,可是終始不會被調用 。。。
我甚至做過這個測試,把avgScore()設成@Cloumn(insertable=false,updateable=false),還是不會自動set進po中。。

G. JAVA如何用Hibernate執行原生SQL返回List

//原生sql查詢可以使用createsqlquery(string
sql)方法
下面代碼表示查詢所有的用戶
list
users=session.createsqlquery("select
*
from
user").list();

H. mysql hibernate的sql查詢怎麼返回實體類

[java] view plain
sql為select a.*, b.id as childId, b.childName from a,b where a.id = b.id

當遇到Column '*' not found找不到的時候,首先檢查該欄位是否存在,如果存在還有這個錯誤,有兩種解決辦法
第一種:有可能是你的*欄位取了別名,那麼在查詢的時候一定要指定改別名的類型,為已經存在的別名指定數據類型。只需要為最外層的有別名的欄位指定類型即可。代碼如下:

[java] view plain
SQLQuery query = session.createSQLQuery(sql).addScalar("別名", Hibernate.INTEGER);//指定別名的數據類型//多個別名可以連續寫多個如:session.createSQLQuery(sql).addScalar("別名", Hibernate.INTEGER).addScalar("別名1",Hibernate.INTEGER);

I. java開發中,為什麼我的sql語句在hibernate原生sql查詢時查不到結果

是mysql的問題,將mysql的安裝目錄下的my.ini中的兩個地方改為utf8解決。
如果忘記mysql的安裝路徑,可以win+r(開始-運行) 然後 services.msc
找到mysql服務,右鍵查看屬性即可。

J. Hibernate3 使用原生sql 返回集能用hbm.xml配置文件映射到類里嗎

不能

一.Hibernate映射文件的作用:

Hibernate映射文件是Hibernate與資料庫進行持久化的橋梁

二,Hibernate映射文件主要內容:

(1).映射內容的定義:

Hibernate映射文件由<hibernate-mapping package="JavaBean所在包的全路徑">節點定義映射內容並指定所對應的JavaBean的位置(也可以不在該節點中用package屬性指定對應的JavaBean位置,而在該節點下的class節點中的name屬性中指定)


(2).資料庫和JavaBean的關聯:

Hibernate映射文件中用<hibernate-mapping>節點下的

<class name="JavaBean名稱" table="對應資料庫中的表名">節點指定資料庫表和JavaBean的關聯。

( 該節點的父節點中用package屬性指定了JavaBean的包名時用)/全路徑(該節點的父節點中沒用package屬性指定JavaBean的包名時用)


(3).主鍵映射:

在<class >節點下用

<id name="資料庫中主鍵在JavaBean中的屬性名稱" column="資料庫中主鍵名" type="string">節點映射對應的主鍵,該節點必須有且只有一個(因為主鍵只有一個),同時必須放在<property ...>節點前

(4).普通欄位映射:

在<class ...>節點下用

<property name="資料庫中欄位在JavaBean中的屬性名稱" column="資料庫中的欄位名" type="string"/>節點映射普通欄位,該節點可有多個(一個欄位用一個該節點來映射)

三,heibernate的主鍵映射方式:

在<id ...>節點下用<generator class="映射方式"/>節點指定Hibernate向資料庫插入數據時主鍵的生成方式

lassigned:應用程序自身對id賦值。當設置<generator class="assigned"/>時,應用程序自身需要負責主鍵id的賦值,由外部程序負責生成(在session.save()之前為對象的主鍵設置值),無需Hibernate參與,一般應用在主鍵為自然主鍵時。例如XH為主鍵時,當添加一個學生信息時,就需要程序員自己設置學號的值,這時就需要應用該id生成器。

lnative:由資料庫對id賦值。當設置<generator class="native"/>時,資料庫負責主鍵id的賦值,最常見的是int型的自增型主鍵。例如,在SQLServer中建立表的id欄位為identity,配置了該生成器,程序員就不用為該主鍵設置值,它會自動設置。

lidentity:採用資料庫提供的主鍵生成機制,為long/short/int型列生成唯一標識如SQL Server、MySQL中的自增主鍵生成機制。

lhilo:通過hi/lo演算法實現的主鍵生成機制,需要額外的資料庫表保存主鍵生成歷史狀態。

lseqhilo:與hi/lo類似,通過hi/lo演算法實現的主鍵生成機制,只是主鍵歷史狀態保存在sequence中,適用於支持sequence的資料庫,如Oracle。

lincrement:主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變數,以保存當前的最大值,之後每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個實例訪問同一個資料庫,由於各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一個資料庫有多個實例訪問,這種方式應該避免使用

lsequence:採用資料庫提供的sequence機制生成主鍵,用於用序列方式產生主鍵的資料庫(如:Oracle、DB2等的Sequence),用於為long/short/int型列生成唯一標識,如:<generator class="sequence"><param name="sequence">序列名</param></generator>如Oracle sequence。

luuid.hex:由Hibernate基於128位唯一值產生演算法,根據當前設備IP、時間、JVM啟動時間、內部自增量等4個參數生成十六進制數值(編碼後長度為32位的字元串表示)作為主鍵。即使是在多實例並發運行的情況下,這種演算法在最大程度上保證了產生id的唯一性。當然,重復的概率在理論上依然存在,只是概率比較小。一般而言,利用uuid.hex方式生成主鍵將提供最好的數據插入性能和數據平台適應性。

luuid.string:與uuid.hex類似,只是對生成的主鍵進行編碼(長度為16位)。在某些資料庫中可能出現問題。

lforeign:使用外部表的欄位作為主鍵。該主鍵一般應用在表與表之間的關繫上,會在後面的表對應關繫上進一步講解。

lselect:Hibernate 3新引入的主鍵生成機制,主要針對遺留系統的改造工程。

由於常用的資料庫,如SQLServer、MySQL等,都提供了易用的主鍵生成機制(如auto-increase欄位),可以在資料庫提供的主鍵生成機制上,採用native生成器來配置主鍵生成方式。


四,映射文件的元素結構和屬性

1,根元素:<hibernate-mapping>,每一個hbm.xml文件都有唯一的一個根元素,包含一些可選的屬性

[html]view plain

  • <hibernate-mappingpackage="com.demo.hibernate.beans">

  • <classname="User"...>

  • </hibernate-mapping>

  • <hibernate-mapping>

  • <classname="com.demo.hibernate.beans.User"...>

  • </hibernate-mapping>

  • (1).package: 指定當前映射文件對應的持久類的完整包名(如:package="entity.")
    (2).schema: 指定當前映射文件對應的資料庫表的schema名
    (3).catalog: 指定當前映射文件對應的資料庫表的catalog名
    (4).default-cascade: 設置默認的級聯方式(默認值為none)
    (5).default-access: 設置默認的屬性訪問方式(默認值為property)
    (6).default-lazy: 設置對沒有指定延遲載入的映射類和集合設定為延遲載入(默認值為true)
    (7).auto-import: 設置當前映射文件中是否可以在HQL中使用非完整的類名(默認值為true)

    hibernate-mapping節點的位元組點:
    (1).class: 為當前映射文件指定對應的持久類名和對應的資料庫表名
    (2).subclass: 指定多態持久化操作時當前映射文件對應的持久類的子類
    (3).meta: 設置類或屬性的元數據屬性
    (4).typedef: 設置新的Hibernate數據類型
    (5).joined-subclass: 指定當前聯結的子類
    (6).union-subclass: 指定當前聯結的子類
    (7).query: 定義一個HQL查詢
    (8).sql-query: 定義一個SQL查詢
    (9).filter-def: 指定過濾器

    2,<class>定義類:根元素的子元素,用以定義一個持久化類與數據表的映射關系,如下是該元素包含的一些可選的屬性

    (1).name: 為當前映射文件指定對應的持久類名
    (2).table: 為當前映射文件指定對應的資料庫表名
    (3).schema: 設置當前指定的持久類對應的資料庫表的schema名
    (4).catalog: 設置當前指定的持久類對應的資料庫表的catalog名
    (5).lazy: 設置是否使用延遲載入
    (6).batch-size: 設置批量操作記錄的數目(默認值為1)
    (7).check: 指定一個SQL語句用於Schema前的條件檢查
    (8).where: 指定一個附加的SQL語句的where條件
    (9).rowid: 指定是否支持ROWID
    (10).entity-name:實體名稱 默認值為類名
    (11).subselect: 將不可變的只讀實體映射到資料庫的子查詢中
    (12).dynamic-update: 指定用於update的SQL語句是否動態生成 默認值為false
    (13).dynamic-insert: 指定用於insert的SQL語句是否動態生成 默認值為false
    (14).insert-before-update: 設定在Hibernate執行update之前是否通過select語句來確定對象是否確實被修改了,如果該對象的值沒有改變,update語句將不會被執行(默認值為false)
    (15).abstract: 用於在聯合子類中標識抽象的超類(默認值為false)
    (16).emutable: 表明該類的實例是否是可變的 默認值為fals
    (17).proxy: 指定延遲載入代理類
    (18).polymorphism: 指定使用多態查詢的方式 默認值為implicit
    (19).persister: 指定一個Persister類
    (20).discriminator-value: 子類識別標識 默認值為類名
    (21).optimistic-lock: 指定樂觀鎖定的策略 默認值為vesion
    class節點的位元組點:
    (1).id: 定義當前映射文件對應的持久類的主鍵屬性和數據表中主鍵欄位的相關信息
    (2).property: 定義當前映射文件對應的持久類的屬性和數據表中欄位的相關信息
    (3).sql-insert: 使用定製的SQL語句執行insert操作
    (4).sql-delete: 使用定製的SQL語句執行delete操作
    (5).sql-update: 使用定製的SQL語句執行update操作
    (6).subselect: 定義一個子查詢
    (7).comment: 定義表的注釋
    (8).composite-id: 持久類與資料庫表對應的聯合主鍵
    (9).many-to-one: 定義對象間的多對一的關聯關系
    (10).one-to-one: 定義對象間的一對一的關聯關系
    (11).any: 定義any映射類型
    (12).map: map類型的集合映射
    (13).set: set類型的集合映射
    (14).list: list類型的集合映射
    (15).array: array類型的集合映射
    (16).bag: bag類型的集合映射
    (17).primitive-array: primitive-array類型的集合映射
    (18).query: 定義裝載實體的HQL語句
    (19).sql-query: 定義裝載實體的SQL語句
    (20).synchronize: 定義持久化類所需要的同步資源
    (21).query-list: 映射由查詢返回的集合
    (22).natural-id: 聲明一個唯一的業務主鍵
    (23).join: 將一個類的屬性映射到多張表中
    (24).sub-class: 聲明多態映射中的子類
    (25).joined-subclass: 生命多態映射中的來連接子類
    (26).union-subclass: 聲明多態映射中的聯合子類
    (27).loader: 定義持久化對象的載入器
    (28).filter: 定義Hibernate使用的過濾器
    (29).component: 定義組件映射
    (30).dynamic-component: 定義動態組件映射
    (31).properties: 定義一個包含多個屬性的邏輯分組
    (32).cache: 定義緩存的策略
    (33).discriminator: 定義一個鑒別器
    (34).meta: 設置類或屬性的元數據屬性
    (35).timestamp: 指定表中包含時間戳的數據
    (36).vesion: 指定表所包含的附帶版本信息的數據

    4,<id>定義主鍵:

    Hibernate使用OID(對象標識符)來標識對象的唯一性,OID是關系資料庫中主鍵在Java對象模型中的等價物,在運行時,Hibernate根據OID來維持Java對象和資料庫表中記錄的對應關系

    id節點的屬性:
    (1).name: 指定當前映射對應的持久類的主鍵名
    (2).column: 指定當前映射對應的資料庫表中的主鍵名(默認值為對應持久類的主鍵/屬性名)
    (3).type: 指定當前映射對應的資料庫表中的主鍵的數據類型
    (4).unsaved-value: 判斷此對象是否進行了保存
    (5).daccess: Hibernate訪問主鍵屬性的策略(默認值為property)

    5.generator節點的屬性:
    (1).class: 指定主鍵生成器
    (2).name: 指定當前映射對應的持久類的主鍵名
    (3).column: 指定當前映射對應的資料庫表中的主鍵名(默認值為對應持久類中的主鍵名)
    (4).type: 指定當前映射對應的資料庫中主鍵的數據類型
    (5).unique: 設置該欄位的值是否唯一(默認值為false)
    (6).not-null: 設置該欄位的值是否可以為null(默認值為false)
    (7).update: 設置update操作時是否包含本欄位的數據(默認值為true)
    (8).insert: 設置insert操作時是否包含本欄位的數據(默認值為true)
    (9).formula: 設置查詢操作時該屬性的值用指定的SQL來計算
    (10).access: Hibernate訪問這個屬性的策略(默認值為property)
    (11).lazy: 設置該欄位是否採用延遲載入策略(默認值為false)
    (12).optimistic-lock: 指定此屬性做更新操作時是否需要樂觀鎖定(默認值為true)

    6.property節點的屬性:
    用於持久化類的屬性與資料庫表欄位之間的映射,包含如下屬性:

    (1)name:持久化類的屬性名,以小寫字母開頭
    (2)column:資料庫表的欄位名
    (3)type:Hibernate映射類型的名字

    (4).formula: 設置當前節點對應的持久類中的屬性的值由指定的SQL從資料庫獲取
    注:指定的SQL必須用()括起來,指定SQL中使用列時必須用表的別名加.加列名的方式訪問,但如果指定SQL中要使用當前映射對應的列時不能用表的別名加.加列名的方式訪問,而是直接訪問即可
    如:formula="(select tn.columnName from tableName tn where tn.columnName=當前映射中的屬性名)"
    (5).unique: 設置該欄位的值是否唯一(默認值為false)
    (6).not-null: 設置該欄位的值是否可以為null(默認值為false)
    (7).not-found: 設置當當前節點對應的資料庫欄位為外鍵時引用的數據不存在時如何讓處理(默認值為exception:產生異常,可選值為ignore:對不存在的應用關聯到null)
    (8).property-ref: 設置關聯類的屬性名,此屬性和本類的關聯相對應 默認值為關聯類的主鍵
    (9).entity-name: 被關聯類的實體名
    (10).lazy: 指定是否採用延遲載入及載入策略(默認值為proxy:通過代理進行關聯,可選值為true:此對象採用延遲載入並在變數第一次被訪問時抓取、false:此關聯對象不採用延遲載入)
    (11).access: Hibernate訪問這個屬性的策略(默認值為property)
    (12).optimistic-lock: 指定此屬性做更新操作時是否需要樂觀鎖定(默認值為true)

    7.one-to-one節點的屬性:
    (1).name: 映射類屬性的名字
    (2).class: 關聯類的名字
    (3).formula: 絕大多數一對一關聯都指向其實體的主鍵。在某些情況下會指向一個或多個欄位或是一個表達式,此時可用一個SQL公式來表示
    (4).cascade: 設置級聯操作時的級聯類型
    (5).constrained: 表明當前類對應的表與被關聯的表之間是否存在著外鍵約束默認值為false
    (6).fetch: 設置抓取數據的策略 可選值為 join外連接抓取、select序列選擇抓取
    (7).property-ref: 設置關聯類的屬性名,此屬性和本類的主鍵相對應 默認值為關聯類的主鍵
    (8).access: Hibernate訪問這個屬性的策略(默認值為property)
    (9).lazy: 指定是否採用延遲載入及載入策略 默認值為proxy通過代理進行關聯 可選值為 true此對象採用延遲載入並在變數第一次被訪問時抓取、false此關聯對象不採用延遲載入
    (10).entity-name: 被關聯類的實體名


    8.many-to-one 元素:
    (1).name: 映射類屬性的名字
    (2).class: 關聯類的名字
    (3).formula: 絕大多數一對一關聯都指向其實體的主鍵。在某些情況下會指向一個或多個欄位或是一個表達式,此時可用一個SQL公式來表示
    (4).column: 中間關聯表映射到目標關聯表的關聯欄位
    (5).cascade: 設置級聯操作時的級聯類型
    (6).fetch: 設置抓取數據的策略 默認值為select序列選擇抓取 可選值為join外連接抓取
    (7).lazy: 指定是否採用延遲載入及載入策略 默認值為proxy通過代理進行關聯 可選值為 true此對象採用延遲載入並在變數第一次被訪問時抓取、false此關聯對象不採用延遲載入
    (8).update: 進行update操作時是否包含此欄位
    (9).insert: 進行insert操作時是否包含此欄位
    (10).not-found: 指定外鍵引用的數據不存在時如何讓處理 默認值為exception產生異常 可選值為ignore對不存在的應用關聯到null

    9.many-to-many 元素
    10.set 元素
    (1).name: 映射類屬性的名字
    (2).table: 關聯的目標資料庫表
    (3).schema: 目標資料庫表的schema名字
    (4).catalog: 目標資料庫表的catalog名字
    (5).subselect: 定義一個子查詢
    (6).sort: 設置排序的類型 默認值為 unsorted不排序 可選值為 natural自然排序、comparatorClass實現介面類作為排序演算法 避免與order-by同時使用
    (7).lazy: 是否採用延遲載入
    (8).inverse: 用於標識雙向關聯中被動的一方 默認值為false
    (9).cascade: 設置級聯操作時的級聯類型
    (10).mutable: 標識被關聯對象是否可以改變 默認值為true
    (11).order-by: 設置排序規則
    (12).where: 增加篩選條件
    (13).batch-size: 延遲載入時,一次讀取數據的數量 默認值為1
    (14).fetch: 設置抓取數據的策略 可選值為 join外連接抓取、select序列選擇抓取
    11.list 元素
    12.map 元素