栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在JPA和Hibernate中使用Java 8 LocalDateTime

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在JPA和Hibernate中使用Java 8 LocalDateTime

由于Hibernate 4不支持它,因此您需要实现一个如本示例所示的用户类型。

import org.hibernate.HibernateException;import org.hibernate.engine.spi.SessionImplementor;import org.hibernate.type.StandardBasicTypes;import org.hibernate.usertype.EnhancedUserType;import java.io.Serializable;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.util.Date;public class LocalDateTimeUserType implements EnhancedUserType, Serializable {    private static final int[] SQL_TYPES = new int[]{Types.TIMESTAMP};    @Override    public int[] sqlTypes() {        return SQL_TYPES;    }    @Override    public Class returnedClass() {        return LocalDateTime.class;    }    @Override    public boolean equals(Object x, Object y) throws HibernateException {        if (x == y) { return true;        }        if (x == null || y == null) { return false;        }        LocalDateTime dtx = (LocalDateTime) x;        LocalDateTime dty = (LocalDateTime) y;        return dtx.equals(dty);    }    @Override    public int hashCode(Object object) throws HibernateException {        return object.hashCode();    }    @Override    public Object nullSafeGet(ResultSet resultSet, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {        Object timestamp = StandardBasicTypes.TIMESTAMP.nullSafeGet(resultSet, names, session, owner);        if (timestamp == null) { return null;        }        Date ts = (Date) timestamp;        Instant instant = Instant.ofEpochMilli(ts.getTime());        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());    }    @Override    public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {        if (value == null) { StandardBasicTypes.TIMESTAMP.nullSafeSet(preparedStatement, null, index, session);        } else { LocalDateTime ldt = ((LocalDateTime) value); Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant(); Date timestamp = Date.from(instant); StandardBasicTypes.TIMESTAMP.nullSafeSet(preparedStatement, timestamp, index, session);        }    }    @Override    public Object deepCopy(Object value) throws HibernateException {        return value;    }    @Override    public boolean isMutable() {        return false;    }    @Override    public Serializable disassemble(Object value) throws HibernateException {        return (Serializable) value;    }    @Override    public Object assemble(Serializable cached, Object value) throws HibernateException {        return cached;    }    @Override    public Object replace(Object original, Object target, Object owner) throws HibernateException {        return original;    }    @Override    public String objectToSQLString(Object object) {        throw new UnsupportedOperationException();    }    @Override    public String toXMLString(Object object) {        return object.toString();    }    @Override    public Object fromXMLString(String string) {        return LocalDateTime.parse(string);    }}

然后,可以在带有@Type批注的映射中使用新的用户类型。例如

@Type(type="com.hibernate.samples.type.LocalDateTimeUserType")@Column(name = "invalidate_token_date")private LocalDateTime invalidateTokenDate;

@Type批注需要一个实现userType接口的类的完整路径;这是用于生成映射列的目标类型的工厂。

这是在JPA2.1中执行相同操作的方法



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号