【问题标题】:How do I map a hibernate Timestamp to a MySQL BIGINT?如何将休眠时间戳映射到 MySQL BIGINT?
【发布时间】:2023-03-29 17:11:02
【问题描述】:

我正在使用 Hibernate 3.x、MySQL 4.1.20 和 Java 1.6。我将 Hibernate Timestamp 映射到 MySQL TIMESTAMP。到目前为止,一切都很好。问题是 MySQL 以秒为单位存储 TIMESTAMP 并丢弃毫秒,我现在需要毫秒精度。我想我可以在我的表中使用 BIGINT 而不是 TIMESTAMP 并转换我的 Java 代码中的类型。我想弄清楚是否有更好的方法使用 hibernate、mysql、JDBC 或某种组合来执行此操作,以便我仍然可以在我的 HSQL 和/或 SQL 查询中使用日期函数?

【问题讨论】:

    标签: java mysql hibernate orm jdbc


    【解决方案1】:

    另外,看看创建一个自定义的 Hibernate Type 实现。类似于(伪代码,因为我没有方便的环境来使其防弹):

    public class CalendarBigIntType extends org.hibernate.type.CalendarType {
        public Object get(ResultSet rs, String name) {
            return cal = new GregorianCalendar(rs.getLong(name));
        }
        public void set(PreparedStatement stmt, Object value, int index) {
            stmt.setParameter(index, ((Calendar) value).getTime());
        }
    }
    

    然后,您需要使用休眠的 TypeDef 和 Type 映射来映射您的新对象。如果您使用的是 Hibernate 注释,请遵循以下原则:

    @TypeDef (name="bigIntCalendar", typeClass=CalendarBigIntType.class)
    @Entity
    public class MyEntity {
        @Type(type="bigIntCalendar")
        private Calendar myDate;
    }
    

    【讨论】:

    • 我喜欢这个答案,扩展 CalendarType 和 TimestampType 有什么好处吗?
    • 不,不是。事实上,您并没有真正必须 扩展任何类型,只是需要更多的工作来实现所有方法。我会选择最接近您要映射的内容。
    【解决方案2】:

    对于那些仍然对此问题感兴趣的人:MySQL 5.6.4 支持精确的时间戳。子类化 MySQL5Dialect 来覆盖使用的 MySQL 类型可以解决问题。

    【讨论】:

      【解决方案3】:

      除了 TIMESTAMP 字段之外,为什么不使用它呢?您将有一个字段(已定义)用于存储日期,没有毫秒,另一个字段用于毫秒。您仍然可以在第一个字段上运行 HSQL 查询,除非您必须确保正确存储毫秒(通过在使用 Hibernate 存储之前解析 Java Date 对象)。

      【讨论】:

      • 这是一种有趣的方法,我认为它会奏效。我仍然想知道是否有其他方法。
      【解决方案4】:

      我将数据类型从时间戳更改为十进制 (17,3) 并编写了一些辅助方法

      public static Calendar bigDec2Cal(BigDecimal tsp) {
          Calendar cal = Calendar.getInstance();
          cal.setTimeInMillis(tsp.longValue());
          return cal;
      }
      
      public static Date bigDec2Date(BigDecimal tsp) {
          Calendar cal = Calendar.getInstance();
          cal.setTimeInMillis(tsp.longValue());
          return cal.getTime();
      }
      
      public static BigDecimal cal2BigDec(Calendar cal) {
          BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
          return tsp;
      }
      
      public static BigDecimal date2BigDec(Date date) {
          Calendar cal = Calendar.getInstance();
          cal.setTime(date);
          BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
          return tsp;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2014-09-06
        • 2010-11-02
        • 2011-07-30
        相关资源
        最近更新 更多