休眠强制时间戳以 UTC 形式持续/加载 [重复]
Posted
技术标签:
【中文标题】休眠强制时间戳以 UTC 形式持续/加载 [重复]【英文标题】:Hibernate force timestamp to persist/load as UTC [duplicate] 【发布时间】:2012-04-07 01:56:44 【问题描述】:我正在使用 java、mysql、hibernate (3.6.x)。 在 java 方面,我使用 java.sql.Timestamp 对象。 在 mysql 方面,我使用的是日期时间列。
我希望 hibernate 使用 UTC 时区保存/加载这些 Timestamp 对象,而不考虑 system/java/mysql 时区。
我发现“How to store date/time and timestamps in UTC time zone with JPA and Hibernate”提供了丰富的信息,但缺少一些我正在努力寻找的最终实施信息。
我想实现一个 UtcTimestampTypeDescriptor,如该线程中所示,并将休眠配置为使用它而不是普通的 TimestampTypeDescriptor。
如何将休眠配置为使用 UtcTimestamp 类型而不是默认的 Timestamp 类型?
【问题讨论】:
为什么不尝试实现community.jboss.org/wiki/UserTypeForNon-defaultTimeZone,然后提出具体问题。 我不想实现一个简单的用户类型并注释每个日期/tiemstamp 属性。相反,我想实现一个描述符并将其注册到休眠状态而不是默认的 timstamp 描述符。具体的问题是我在哪里用hibernate注册这个类型,所以它会替换默认的? ***.com/questions/4725719/hibernate-typeresolver 我尝试实现上述链接,它可以追溯到大约 2007 年的 Hibernate 3 早期版本,其 API 在 JPA 2 和 Hibnerate 4.x 下已经完全改变。该实现存在许多问题,使其完全不兼容。 【参考方案1】:仅适用于 MySQL,实现自定义 Hibernate 类型的替代方法是将以下 JDBC 选项添加到您的 JDBC 连接 URL:
useTimezone=true
serverTimezone=UTC
这将强制您的 JDBC 连接到 UTC 时区,并要求 MySQL 从 JVM 时区执行转换。最终效果是您可以在 JVM 上保留本地时区(例如,用于打印日志消息等),而 DATETIME 列将保留为 UTC。
例如:
<bean id="hibernateAnalysisSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<!-- Connection parameters -->
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://hostname/databaseName?useTimezone=true&serverTimezone=UTC</prop>
...
【讨论】:
成功了!非常感谢:D【参考方案2】:从your link获取类public class UtcTimestampType extends TimestampType
并制作此代码
@org.hibernate.annotations.Type(type = "yourPackage.UtcTimestampType")
public java.util.Date date;
使用注释
或
<property name="date" column="yourColumn" type="yourPackage.UtcTimestampType" />
使用 *.hbm.xml
【讨论】:
我不想注释我拥有的每个日期/时间戳属性。我希望休眠始终使用 UTCTimestampType 而不是默认类型。 不可能。 UTCTimestampType 是自定义用户类型。如果你愿意,你可以解压 Hibernate 的库并破解它。 查看该示例,查看 hibernate 3.6 示例。有一个描述符的例子,而不是一个类型。然后它说当应用程序启动时,您可以注册这种类型而不是默认类型,但它没有说明如何/在哪里......这基本上是我的问题。 你可以这样做,使用 class Configuration cfg = new Configuration().configure("your.cfg.xml"); cfg.registerTypeOverride(new UtcTimestampType()); 我按照你的方法使用了注解,但是休眠似乎忽略了 UtcTimestampType,为什么? (甚至没有命中调试器断点)我有 Hibernate 3.6.10以上是关于休眠强制时间戳以 UTC 形式持续/加载 [重复]的主要内容,如果未能解决你的问题,请参考以下文章