亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

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

2020-07-27 21:22:45
字體:
來源:轉載
供稿:網友

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; }...}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线视频不卡| 国产精品自产拍在线观看中文| 亚洲欧美国内爽妇网| 亚洲精品免费一区二区三区| 亚洲新中文字幕| 日韩电影在线观看中文字幕| 欧洲美女免费图片一区| 亚洲欧洲偷拍精品| 欧美电影在线观看完整版| 亚洲精品中文字幕女同| 亚洲欧美日韩中文在线| 国自在线精品视频| 亚洲国产精品人人爽夜夜爽| 国产精品一区二区三区在线播放| 欧美成人精品激情在线观看| 亚洲女人初尝黑人巨大| 国产精自产拍久久久久久蜜| 亚洲xxxx3d| 欧美丰满老妇厨房牲生活| 最好看的2019的中文字幕视频| 国产精品成熟老女人| 神马国产精品影院av| 国产精品一区=区| 成人黄色午夜影院| 国产精品视频在线观看| 国产精品极品美女粉嫩高清在线| 欧洲中文字幕国产精品| 日韩av在线最新| 欧洲午夜精品久久久| 欧美激情一区二区三级高清视频| 91久久久精品| 中国china体内裑精亚洲片| 成人免费网视频| 亚洲人成网在线播放| 欧美成人免费在线视频| 欧美激情视频一区二区三区不卡| 国产美女扒开尿口久久久| 日韩黄色av网站| 久久久人成影片一区二区三区| 亚洲女人天堂色在线7777| 久久精品国产久精国产一老狼| 亚洲成人久久久久| 96sao精品视频在线观看| 7777精品视频| 精品久久久久久久久久| 中文字幕亚洲欧美日韩高清| 综合激情国产一区| 啊v视频在线一区二区三区| 中文字幕亚洲情99在线| 久久久久久久一| 成人在线中文字幕| 亚洲综合在线小说| 欧美极品美女视频网站在线观看免费| 97久久精品人人澡人人爽缅北| 亚洲成人xxx| 亚洲乱码一区av黑人高潮| 91免费视频网站| 国产成人久久久| 88国产精品欧美一区二区三区| 精品视频偷偷看在线观看| 国产精品999| 国产精品揄拍500视频| 亚洲国产成人爱av在线播放| 国产成人中文字幕| 欧美精品18videos性欧| 国产精品白丝jk喷水视频一区| 91欧美精品午夜性色福利在线| 中文字幕久久精品| 91热福利电影| 日韩中文字幕视频在线观看| 精品一区二区三区三区| 亚洲精品第一国产综合精品| 亚洲人午夜精品免费| 成人在线视频网站| 国产亚洲欧美一区| 国产日韩在线一区| 国产欧美一区二区三区四区| 亚洲九九九在线观看| 精品国产欧美一区二区三区成人| 狠狠久久五月精品中文字幕| 亚洲国产日韩欧美在线动漫| 久久亚洲精品中文字幕冲田杏梨| 美女999久久久精品视频| **欧美日韩vr在线| 国内免费精品永久在线视频| 国产精品私拍pans大尺度在线| 亚洲人成在线观| 成人中心免费视频| 欧美精品久久一区二区| 亚洲欧洲国产精品| 日韩av影视在线| 97精品在线观看| 久久久精品国产网站| 亚洲女人天堂色在线7777| 91爱爱小视频k| 91免费视频网站| 久久精视频免费在线久久完整在线看| 日韩欧美国产中文字幕| 精品无人区太爽高潮在线播放| 国产精品久久av| 亚洲美女动态图120秒| 欧美在线激情视频| 91产国在线观看动作片喷水| 久久亚洲春色中文字幕| 美女扒开尿口让男人操亚洲视频网站| www.亚洲天堂| 日本成人免费在线| 国产精品视频一区二区高潮| 国产精品男女猛烈高潮激情| 在线观看成人黄色| 久久久精品国产| 欧美精品亚州精品| 成人精品视频久久久久| 97香蕉超级碰碰久久免费的优势| 日本中文字幕不卡免费| 亚洲精选一区二区| 国产精品福利网站| 亚洲福利在线视频| 亚洲三级 欧美三级| 亚洲精品视频中文字幕| 日韩精品中文字幕在线| 2019中文字幕在线免费观看| 亚洲国产精品va| 欧美性xxxxxx| 九九视频这里只有精品| 97香蕉超级碰碰久久免费的优势| 日韩电影在线观看中文字幕| 91在线视频导航| 日本久久久久久| 亚州成人av在线| 国产精品综合久久久| 欧美电影第一页| 一区二区三区 在线观看视| 亚洲人成亚洲人成在线观看| 91系列在线播放| 国产日韩欧美在线播放| 午夜精品久久久久久久久久久久久| 国产精品专区h在线观看| 欧美成人剧情片在线观看| 亚洲最大福利视频| 国产精品视频久久久| 国产精品视频不卡| 大伊人狠狠躁夜夜躁av一区| 2020国产精品视频| 国产精品永久免费视频| 成人福利免费观看| 欧美另类在线播放| 4p变态网欧美系列| 日韩精品免费在线播放| 国产主播在线一区| 亚洲欧美中文日韩在线v日本| 国产中文字幕亚洲| 欧美疯狂xxxx大交乱88av| 久国内精品在线| 亚洲国产精彩中文乱码av在线播放| 91亚洲永久免费精品| 欧洲日韩成人av| 亚洲精品美女久久久久| 日韩电影中文字幕在线| 日韩国产欧美区| 国产网站欧美日韩免费精品在线观看| 91国偷自产一区二区三区的观看方式| 91在线免费观看网站| 91午夜理伦私人影院|