a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > JSP > 正文

Hibernate識(shí)別數(shù)據(jù)庫(kù)特有字段實(shí)例詳解

2024-09-05 00:23:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Hibernate識(shí)別數(shù)據(jù)庫(kù)特有字段實(shí)例詳解

前言:

Hibernate已經(jīng)為絕大多數(shù)常用的數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型提供了內(nèi)置支持,但對(duì)于某些數(shù)據(jù)庫(kù)的專(zhuān)屬字段支持就不夠好了。 這些特殊數(shù)據(jù)類(lèi)型往往提供了比常規(guī)數(shù)據(jù)類(lèi)型更好的數(shù)據(jù)表達(dá)能力,更符合我們的業(yè)務(wù)場(chǎng)景。比如PostgreSQL的Interval類(lèi)型,可以非常方便的保存一個(gè)時(shí)間段的數(shù)據(jù)。 本文以添加Interval類(lèi)型支持為例,說(shuō)明為Hibernate添加特有數(shù)據(jù)類(lèi)型支持的方法。
Hibernate提供了豐富的數(shù)據(jù)類(lèi)型支持,但對(duì)于部分?jǐn)?shù)據(jù)庫(kù)專(zhuān)有的數(shù)據(jù)類(lèi)型,提供的支持就很有限了。比如PostgreSQL的Interval類(lèi)型,對(duì)于保存一個(gè)"時(shí)間段"數(shù)據(jù)就非常方便。

在開(kāi)發(fā)中,我們期望將Interval類(lèi)型映射為Java 8 的Duration類(lèi)型。但是Hibernate默認(rèn)對(duì)Duration類(lèi)型的映射是直接映射到數(shù)據(jù)庫(kù)的BigInt類(lèi)型,直接保存納秒值。顯然對(duì)于不直接支持Interval類(lèi)型的數(shù)據(jù)庫(kù)來(lái)說(shuō),是比較合適的,但是我們?nèi)匀黄谕苯佑成涞綌?shù)據(jù)庫(kù)的Interval類(lèi)型。

為此,我們需要調(diào)整Hibernate對(duì)于兩種數(shù)據(jù)類(lèi)型(Java世界的Duration和Db世界的Interval)的映射關(guān)系。

幸運(yùn)的是,Hibernate提供了非常方便的方法可以實(shí)現(xiàn)數(shù)據(jù)類(lèi)型的映射。

為此,我們需要一個(gè)實(shí)現(xiàn)org.hibernate.usertype.UserType接口的類(lèi),來(lái)實(shí)現(xiàn)兩個(gè)世界的數(shù)據(jù)轉(zhuǎn)換/映射工作。

Hibernate的自定義類(lèi)型(UserType)

UserType是Hibernate提供的一個(gè)自定義數(shù)據(jù)類(lèi)型的接口。所有自定義數(shù)據(jù)均需實(shí)現(xiàn)此接口,或者從org.hibernate.usertype中定義的接口中選擇一個(gè)合適的接口。

鑒于我們的場(chǎng)景比較簡(jiǎn)單,直接實(shí)現(xiàn)UserType即可滿足需求。此接口提供了如下一組方法需要自己實(shí)現(xiàn):

assemble(Serializable cached, Object owner)

     從序列化中重新構(gòu)建(Java)對(duì)象。

deepCopy(Object value)

      返回深度副本。

disassemble(Object value)

     轉(zhuǎn)換對(duì)象的序列化數(shù)據(jù)。

equals(Object x, Object y)

     返回兩個(gè)映射的數(shù)據(jù)是否相等。

hashCode(Object x)

      獲取對(duì)象的散列。

isMutable()

      返回對(duì)象是否是可變類(lèi)型。

nullSafeGet(ResultSet rs, String[] names, Object owner)

      從數(shù)據(jù)庫(kù)類(lèi)型的數(shù)據(jù),返回對(duì)應(yīng)的Java對(duì)象。核心實(shí)現(xiàn)方法

nullSafeSet(PreparedStatement st, Object value, int index)

       從Java對(duì)象,返回對(duì)應(yīng)的數(shù)據(jù)庫(kù)類(lèi)型的數(shù)據(jù)。核心實(shí)現(xiàn)方法

replace(Object original, Object target, Object owner)

       合并期間,將實(shí)體中的目標(biāo)值(target)替換為原始值(original)。

returnedClass()

      nullSafeGet返回的類(lèi)。

sqlTypes()

       返回對(duì)應(yīng)的數(shù)據(jù)庫(kù)類(lèi)型。

實(shí)例

package framework.postgresql;import org.hibernate.HibernateException;import org.hibernate.engine.spi.SharedSessionContractImplementor;import org.hibernate.usertype.UserType;import org.postgresql.util.PGInterval;import java.io.Serializable;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import java.time.Duration;/** * PostgreSql Inteval字段與java.time.Duration映射 * 目前只支持到最多1個(gè)月(30天)的間隔 * <p> * 使用方法: * 在實(shí)體類(lèi)上增加 * /@TypeDef(name="interval", typeClass = IntervalType.class) * 在字段定義上增加: * /@Type(type = "interval") * <p> * http://stackoverflow.com/questions/1945615/how-to-map-the-type-interval-in-hibernate/6139581#6139581 * * @version 1.0 * @since 1.0 */public class IntervalType implements UserType { public Object assemble(Serializable cached, Object owner) throws HibernateException {  return cached; } public Object deepCopy(Object value) throws HibernateException {  return value; } public Serializable disassemble(Object value) throws HibernateException {  return (Serializable) value; } public boolean equals(Object arg0, Object arg1) throws HibernateException {  return arg0 != null && arg1 != null && arg0.equals(arg1) || arg0 == null && arg1 == null; } public int hashCode(Object object) throws HibernateException {  return object.hashCode(); } @Override public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sessionImplementor, Object o) throws HibernateException, SQLException {  String interval = resultSet.getString(names[0]);  if (resultSet.wasNull() || interval == null) {   return null;  }  PGInterval pgInterval = new PGInterval(interval);  return getDuration(pgInterval); } @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor sessionImplementor) throws HibernateException, SQLException {  if (value == null) {   st.setNull(index, Types.OTHER);  } else {   //this http://postgresql.1045698.n5.nabble.com/Inserting-Information-in-PostgreSQL-interval-td2175203.html#a2175205   Duration duration = (Duration) value;   st.setObject(index, getInterval(duration), Types.OTHER);  } } public static Duration getDuration(PGInterval pgInterval) {  return Duration.ofSeconds(pgInterval.getDays() * 24 * 3600 +    pgInterval.getHours() * 3600 +    pgInterval.getMinutes() * 60 +    (int) pgInterval.getSeconds()); } private static PGInterval getInterval(Duration value) {  long seconds = value.getSeconds();  int days = (int) (seconds / (24 * 3600));  seconds -= days * 24 * 3600;  int hours = (int) (seconds / 3600);  seconds -= hours * 3600;  int minutes = (int) (seconds / 60);  seconds -= minutes * 60;  seconds = Math.abs(seconds);  return new PGInterval(0, 0, days, hours, minutes, seconds); } public boolean isMutable() {  return false; } public Object replace(Object original, Object target, Object owner) throws HibernateException {  return original; } public Class returnedClass() {  return Duration.class; } public int[] sqlTypes() {  return new int[]{Types.OTHER}; }}

使用自定義類(lèi)型

至此,我們已經(jīng)定義好了自己的數(shù)據(jù)類(lèi)型。但Hibernate還不知道怎么使用它。為此,我們需要通過(guò)在Entity上使用使用TypeDef注解,并在屬性上使用Type注解。

比如:

...@Entity@TypeDef(name = "interval", typeClass = IntervalType.class)public class PaperStatis implements Serializable {... @Column(name = "avg_duration") @Type(type = "interval") public Duration getAvgDuration() {  return this.avgDuration; }...}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JSP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久天天 | 午夜影院免费观看视频 | 亚洲一级在线观看 | 久久精品欧美一区二区三区不卡 | 日本一二三区视频 | 久久精品国产免费 | 一级毛片大全免费播放 | 天天网 | 精品久久99 | 国产三级在线 | 黄色欧美一级片 | 国产精品一区二区三区免费 | 国产在线精品成人免费怡红院 | 国产精品一区亚洲二区日本三区 | 欧美视频成人 | 四虎国产成人永久精品免费 | 免费av在线网 | 18久久久久久 | 本道综合精品 | 国产一区二区三区精品在线 | 亚洲综合国产 | 蜜臀av国产精品久久久久 | 逼逼av| 亚洲精品国产第一综合99久久 | 国产在线中文字幕 | 精品国产一区二区三区久久久 | 国产精品视频免费播放 | 亚洲免费小视频 | 日本久久久 | 激情一区二区三区 | 羞羞视频在线播放 | aaa级片| 亚洲天天干 | 3bmm在线观看视频免费 | 一区二区免费视频 | 国产露脸150部国语对白 | 毛片网站在线 | 国产精品精品视频一区二区三区 | 国产精品国产成人国产三级 | 成人黄色片网站 | 精品国产乱码久久久久久影片 |