黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Hibernate對(duì)自定義類(lèi)型UserType的用法

系統(tǒng) 2243 0

Hibernate允許我們自定義映射屬性的類(lèi)型,比如一個(gè)學(xué)生有聯(lián)系地址,而聯(lián)系地址又分為家庭地址和工作地址,我們可以把兩個(gè)地址信息抽象成一個(gè)新的Address類(lèi),作為Student的成員變量

數(shù)據(jù)庫(kù)結(jié)構(gòu):

?

create ? table ?typestu?(id? varchar ( 32 )? primary ? key ,name? varchar ( 32 ),homeaddr? varchar ( 32 ),workaddr? varchar ( 32 ));

Hibernate.cfg.xml

?

<? xml?version='1.0'?encoding='UTF-8' ?>
<! DOCTYPE?hibernate-configuration?PUBLIC
??????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
??????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- ?Generated?by?MyEclipse?Hibernate?Tools.??????????????????? -->
< hibernate-configuration >

< session-factory >
????
< property? name ="connection.username" > root </ property >
????
< property? name ="connection.url" >
????????jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312
&amp; useUnicode=true
????
</ property >
????
< property? name ="dialect" >
????????org.hibernate.dialect.MySQLDialect
????
</ property >
????
< property? name ="myeclipse.connection.profile" > mysql </ property >
????
< property? name ="connection.password" > 1234 </ property >
????
< property? name ="connection.driver_class" >
????????com.mysql.jdbc.Driver
????
</ property >
????
< property? name ="hibernate.dialect" >
????????org.hibernate.dialect.MySQLDialect
????
</ property >
????
< property? name ="hibernate.show_sql" > true </ property >
????
< property? name ="current_session_context_class" > thread </ property >
????
< mapping? resource ="Search/UserType/Student.hbm.xml" ? />

</ session-factory >

</ hibernate-configuration >

?Pojo

?

package ?Search.UserType;


public ? class ?Student? ... {
????
private ?String?id;? // 標(biāo)識(shí)id
???? private ?String?name;? // 學(xué)生姓名
???? private ?AddressType?address; // 地址
???? public ?String?getId()? ... {
????????
return ?id;
????}

????
public ? void ?setId(String?id)? ... {
????????
this .id? = ?id;
????}

????
public ?String?getName()? ... {
????????
return ?name;
????}

????
public ? void ?setName(String?name)? ... {
????????
this .name? = ?name;
????}

????
public ?AddressType?getAddress()? ... {
????????
return ?address;
????}

????
public ? void ?setAddress(AddressType?address)? ... {
????????
this .address? = ?address;
????}


?
?
?
}

?

自定義類(lèi)型

?


package ?Search.UserType;

import ?java.io.Serializable;
import ?java.sql.PreparedStatement;
import ?java.sql.ResultSet;
import ?java.sql.SQLException;
import ?java.sql.Types;

import ?org.apache.commons.lang.builder.EqualsBuilder;
import ?org.apache.commons.lang.builder.HashCodeBuilder;
import ?org.hibernate.HibernateException;
import ?org.hibernate.usertype.UserType;

public ? class ?AddressType? implements ?UserType,?Serializable? ... {
????
private ?String?homeAddr;
????
private ?String?workAddr;

????
/**/ /* ?有幾個(gè)字段就有幾個(gè)值,這里容易出錯(cuò),要多注意? */
????
private ? static ? final ? int []?SQL_TYPES? = ? ... {?Types.VARCHAR,?Types.VARCHAR?} ;

????
/**/ /* ?這個(gè)方法告訴Hibernate在成生DDL時(shí)對(duì)列采用什么樣的SQL語(yǔ)法? */
????
public ? int []?sqlTypes()? ... {
????????
return ?SQL_TYPES;
????}


????
/**/ /*
?????*?Hibernate返回什么樣的映射類(lèi)型,與?<property?name="address"?type="model.AddressType">
?????*?指定的類(lèi)一致。事實(shí)上也可以把AddressType拆分為兩個(gè)類(lèi),一個(gè)類(lèi)是只攜帶信息的JavaBean,它里面
?????*?沒(méi)有邏輯操作也沒(méi)有實(shí)現(xiàn)UserType(比如AddressBean);而另一個(gè)類(lèi)實(shí)現(xiàn)了UserType,它所面對(duì)的就不是現(xiàn)在這個(gè)
?????*?AddressType類(lèi)的homeAddr和homeAddr屬性,它面對(duì)的是AddressBean。在本例中為了簡(jiǎn)潔方便,只用了一個(gè)類(lèi)。
?????
*/

????
public ?Class?returnedClass()? ... {
????????
return ?AddressType. class ;
????}


????
/**/ /*
?????*?表明這個(gè)類(lèi)的實(shí)例在創(chuàng)建以后就不可以改變屬性。Hibernate能為不可改變的類(lèi)作一些性能優(yōu)化。
?????
*/

????
public ? boolean ?isMutable()? ... {
????????
return ? false ;
????}


????
/**/ /*
?????*?由于A(yíng)ddressType是不可變的,所以深拷貝可以直接返回對(duì)象引用。拷貝的對(duì)象由應(yīng)用程序使用,?而原版對(duì)象由Hibernate維護(hù)以做臟數(shù)據(jù)檢查
?????
*/

????
public ?Object?deepCopy(Object?value)? ... {
????????
return ?value;? // ?Address?is?immutable
????}


????
/**/ /* ?兩個(gè)對(duì)象是否相等,使用了apache的common工具包來(lái)進(jìn)行屬性比對(duì)? */
????
public ? boolean ?equals(Object?x,?Object?y)? ... {
????????
if ?(x? == ?y)
????????????
return ? true ;
????????
if ?(x? == ? null ? || ?y? == ? null )
????????????
return ? false ;
????????AddressType?add1?
= ?(AddressType)?x;
????????AddressType?add2?
= ?(AddressType)?y;
????????
return ? new ?EqualsBuilder()? // 使用EqualsBuilder類(lèi)來(lái)方便地進(jìn)行比對(duì)
????????????????.append(add1.getHomeAddr(),?add2.getHomeAddr()).append(
????????????????????????add2.getWorkAddr(),?add2.getWorkAddr()).isEquals();
????}


????
/**/ /* ?得到hash碼? */

????
public ? int ?hashCode(Object?x)? throws ?HibernateException? ... {
????????AddressType?address?
= ?(AddressType)?x;
????????
return ? new ?HashCodeBuilder() // 使用HashCodeBuilder類(lèi)來(lái)方便地進(jìn)行比對(duì)
????????????????.append(address.getHomeAddr()).append(address.getWorkAddr())
????????????????.toHashCode();
????}


????
/**/ /* ?讀取數(shù)據(jù)并組裝成一個(gè)AddressType對(duì)象。names[]中的參數(shù)順序依照映射文件中定義的順序? */
????
public ?Object?nullSafeGet(ResultSet?rs,?String[]?names,?Object?owner)
????????????
throws ?HibernateException,?SQLException? ... {
????????
if ?(rs.wasNull())
????????????
return ? null ;
????????String?homeAddr?
= ?rs.getString(names[ 0 ]);
????????String?schoolAddr?
= ?rs.getString(names[ 1 ]);
????????AddressType?address?
= ?

Hibernate對(duì)自定義類(lèi)型UserType的用法


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論