婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Hibernate識別數據庫特有字段實例詳解

Hibernate識別數據庫特有字段實例詳解

熱門標簽:電銷機器人免培訓 電話機器人需要使用網絡嗎 如何看懂地圖標注點 給地圖標注得傭金 海外圖書館地圖標注點 自繪地圖標注數據 南通通訊外呼系統產品介紹 潤滑油銷售電銷機器人 外呼系統使用方法

Hibernate識別數據庫特有字段實例詳解

前言:

Hibernate已經為絕大多數常用的數據庫數據類型提供了內置支持,但對于某些數據庫的專屬字段支持就不夠好了。 這些特殊數據類型往往提供了比常規數據類型更好的數據表達能力,更符合我們的業務場景。比如PostgreSQL的Interval類型,可以非常方便的保存一個時間段的數據。 本文以添加Interval類型支持為例,說明為Hibernate添加特有數據類型支持的方法。
Hibernate提供了豐富的數據類型支持,但對于部分數據庫專有的數據類型,提供的支持就很有限了。比如PostgreSQL的Interval類型,對于保存一個"時間段"數據就非常方便。

在開發中,我們期望將Interval類型映射為Java 8 的Duration類型。但是Hibernate默認對Duration類型的映射是直接映射到數據庫的BigInt類型,直接保存納秒值。顯然對于不直接支持Interval類型的數據庫來說,是比較合適的,但是我們仍然期望直接映射到數據庫的Interval類型。

為此,我們需要調整Hibernate對于兩種數據類型(Java世界的Duration和Db世界的Interval)的映射關系。

幸運的是,Hibernate提供了非常方便的方法可以實現數據類型的映射。

為此,我們需要一個實現org.hibernate.usertype.UserType接口的類,來實現兩個世界的數據轉換/映射工作。

Hibernate的自定義類型(UserType)

UserType是Hibernate提供的一個自定義數據類型的接口。所有自定義數據均需實現此接口,或者從org.hibernate.usertype中定義的接口中選擇一個合適的接口。

鑒于我們的場景比較簡單,直接實現UserType即可滿足需求。此接口提供了如下一組方法需要自己實現:

assemble(Serializable cached, Object owner)

     從序列化中重新構建(Java)對象。

deepCopy(Object value)

      返回深度副本。

disassemble(Object value)

     轉換對象的序列化數據。

equals(Object x, Object y)

     返回兩個映射的數據是否相等。

hashCode(Object x)

      獲取對象的散列。

isMutable()

      返回對象是否是可變類型。

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

      從數據庫類型的數據,返回對應的Java對象。核心實現方法

nullSafeSet(PreparedStatement st, Object value, int index)

       從Java對象,返回對應的數據庫類型的數據。核心實現方法

replace(Object original, Object target, Object owner)

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

returnedClass()

      nullSafeGet返回的類。

sqlTypes()

       返回對應的數據庫類型。

實例

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個月(30天)的間隔
 * p>
 * 使用方法:
 * 在實體類上增加
 * \@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};
 }

}

使用自定義類型

至此,我們已經定義好了自己的數據類型。但Hibernate還不知道怎么使用它。為此,我們需要通過在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;
 }
...
}

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

您可能感興趣的文章:
  • Hibernate迫切連接和普通連接的區別實例詳解
  • hibernate通過session實現增刪改查操作實例解析
  • 在已有spring的基礎上集成hibernate的實例講解
  • hibernate屬性級別注解實例代碼
  • Hibernate 修改數據的實例詳解
  • JSP開發之hibernate之單向多對一關聯的實例
  • hibernate4快速入門實例詳解
  • Hibernate初體驗及簡單錯誤排除代碼詳解

標簽:貸款邀約 南京 樂山 大連 黃石 內江 銅川 廣州

巨人網絡通訊聲明:本文標題《Hibernate識別數據庫特有字段實例詳解》,本文關鍵詞  Hibernate,識別,數據庫,特有,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Hibernate識別數據庫特有字段實例詳解》相關的同類信息!
  • 本頁收集關于Hibernate識別數據庫特有字段實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲18影院在线观看| 99久久国产免费看| 欧美国产日韩一二三区| 91精品久久久久久久久99蜜臂| 在线精品视频小说1| 日韩欧美一区二区在线视频| 日本丰满少妇一区二区三区| 日韩精品自拍偷拍| 国产高清不卡一区| 久久免费精品国产久精品久久久久 | 岛国av在线一区| 国产高清成人在线| 久久色成人在线| 另类小说视频一区二区| 2022国产精品视频| 高清av一区二区| 亚洲免费av在线| 欧美中文字幕不卡| 亚洲一区二区四区蜜桃| 欧美日韩一区二区三区免费看| 日韩精品一区二区三区在线观看 | 亚洲超碰97人人做人人爱| 91黄色激情网站| 蜜桃在线一区二区三区| 日本91福利区| 国产99一区视频免费| 亚洲综合在线观看视频| 日韩一区二区中文字幕| 国产成人午夜片在线观看高清观看 | 亚洲一区在线电影| 久久色在线视频| 在线观看日韩精品| 经典三级视频一区| 欧美高清视频www夜色资源网| 国产精品一区免费视频| 综合精品久久久| 国产精品国产成人国产三级 | 91亚洲男人天堂| 成人国产精品免费网站| 国产欧美视频在线观看| 91精品久久久久久蜜臀| 国产精品亚洲成人| 国产一区二区三区综合| 午夜精品一区二区三区免费视频| 欧美激情一区二区三区全黄| 日韩欧美在线不卡| 欧美一级欧美三级在线观看| 中文字幕中文字幕中文字幕亚洲无线| 日韩亚洲欧美中文三级| 在线不卡a资源高清| 欧美一区二区三区在线观看视频| 69久久夜色精品国产69蝌蚪网| 26uuu亚洲| 91精品国产色综合久久久蜜香臀| 欧美绝品在线观看成人午夜影视| 欧美精品九九99久久| 欧美人与z0zoxxxx视频| 日韩欧美自拍偷拍| 久久爱另类一区二区小说| 亚洲欧洲性图库| 午夜精品福利一区二区三区av| 蜜臀av性久久久久av蜜臀妖精| 懂色av中文一区二区三区| va亚洲va日韩不卡在线观看| 欧美日本国产视频| 综合中文字幕亚洲| 国产精品一区免费在线观看| 欧美日韩一卡二卡三卡 | 成人午夜视频福利| 欧美日韩中文字幕精品| 久久久久久久久免费| 国产色一区二区| 美女网站一区二区| 在线播放日韩导航| √…a在线天堂一区| 免费高清视频精品| 欧美剧在线免费观看网站 | 久久69国产一区二区蜜臀| 91日韩精品一区| 国产精品盗摄一区二区三区| 精品中文av资源站在线观看| 欧美三级电影一区| 日韩精彩视频在线观看| 欧美色视频在线观看| 亚洲乱码中文字幕| 91猫先生在线| 国产精品成人午夜| 91麻豆免费视频| 日韩一区欧美小说| 欧美视频三区在线播放| 91九色02白丝porn| 一区二区三区四区精品在线视频 | 狠狠色综合播放一区二区| 亚洲图片你懂的| 欧美日韩成人高清| 日本女人一区二区三区| 亚洲精品国产一区二区精华液 | 中文字幕一区二区三区乱码在线 | 婷婷六月综合网| 丝袜亚洲另类欧美| 欧美中文一区二区三区| 91久久精品日日躁夜夜躁欧美| 精品三级在线看| 欧美性生活久久| www.在线成人| 久久久影视传媒| 艳妇臀荡乳欲伦亚洲一区| 91行情网站电视在线观看高清版| 亚洲动漫第一页| 成人精品一区二区三区中文字幕 | 亚洲天堂免费看| 精品国一区二区三区| 色婷婷av一区| 日本亚洲最大的色成网站www| 2024国产精品| 在线91免费看| 欧美亚洲日本一区| 久久精品国产亚洲高清剧情介绍| 日韩免费高清视频| 亚洲激情第一区| 91国产成人在线| 夜夜夜精品看看| 免费人成网站在线观看欧美高清| 蜜臀91精品一区二区三区| 欧美成人激情免费网| 久久99国产精品久久99| 欧美一区二视频| 天天综合天天综合色| 欧美成人a在线| 久久国产精品99精品国产| 2020日本不卡一区二区视频| 日韩精品免费专区| 亚洲国产精品人人做人人爽| 一区二区三区日韩精品| 制服丝袜国产精品| fc2成人免费人成在线观看播放 | 亚洲日穴在线视频| 欧美日韩亚洲综合在线 | 免费在线成人网| 欧美在线不卡一区| 蜜臀av在线播放一区二区三区| 精品亚洲免费视频| 亚洲成人免费影院| 1000精品久久久久久久久| 精品久久国产97色综合| 欧美性感一类影片在线播放| 91黄色免费观看| 亚洲大片精品永久免费| 亚洲天堂精品在线观看| 欧美变态口味重另类| 欧美福利一区二区| 精品视频一区三区九区| 成人午夜私人影院| 不卡的av电影在线观看| 国产在线不卡一区| 一区二区三区精品在线| 中文字幕av一区 二区| 久久精品人人做人人爽人人| 欧美一区二区三区思思人| 欧美日韩一区三区四区| 6080yy午夜一二三区久久| 午夜一区二区三区视频| 国产一区视频导航| 欧美日本精品一区二区三区| 国产精品不卡一区二区三区| 国产成人av电影| 成人视屏免费看| 国产日韩视频一区二区三区| 久久97超碰国产精品超碰| 国产成人免费9x9x人网站视频| 欧美写真视频网站| 亚洲第一会所有码转帖| 自拍偷拍亚洲综合| 亚洲国产另类精品专区| 欧美三级中文字幕在线观看| 一区二区三区在线观看欧美| 成人午夜av电影| 亚洲美女偷拍久久| 欧美日韩国产另类不卡| 一区二区三区日韩精品| 精品视频色一区| 韩国成人在线视频| 国产精品午夜免费| 欧美在线观看一二区| 午夜亚洲国产au精品一区二区| 欧美日韩电影一区| 另类的小说在线视频另类成人小视频在线 | 欧美一区二区三区四区视频| 久久久综合网站| 日日摸夜夜添夜夜添精品视频| 成人午夜又粗又硬又大| 26uuu精品一区二区在线观看| 午夜精品久久久久久不卡8050| 欧美一区二区三区在| 亚洲女性喷水在线观看一区| 国产精品一色哟哟哟| 日韩色在线观看| 国产一区二区三区高清播放| 国产一区二区三区在线观看免费视频 | 亚洲视频一区在线观看|