JPA/Hibernate 将简单字符串或任意对象映射到 mysql 日期类型?

Posted

技术标签:

【中文标题】JPA/Hibernate 将简单字符串或任意对象映射到 mysql 日期类型?【英文标题】:JPA/Hibernate map simple String or arbitrary object to mysql Date type? 【发布时间】:2011-06-27 02:10:28 【问题描述】:

我对 Hibernate 还很陌生。我想映射一些对象,比如说 String 到一个 mysql 日期(这是一个没有时间或时区的日期)。我认为这将是相当直截了当的。但我似乎找不到好的解决方案。

在我的实际应用中,我没有使用字符串。我想使用 JSR 310 中的 LocalDate 之类的东西,或者我自己的简单月-日-年三元组类型。

我真的...真的不想编写一些内部 setter 或 getter 将我的简单对象转换为 java.sql.Date 或 java.util.Date 因为:

    它使用不必要的代码使域对象膨胀。 我必须在我的所有域对象中编写相同的代码 这有点违背了我使用此类课程的全部目的。使用这些类的全部目的是避免任何可能的时区问题。当我只想保留一个简单的日期(如生日日期 - 2005 年 10 月 1 日)时,引入一个具有时间和时区的类(java.sql.Date 或 java.util.Date)似乎真的很愚蠢。

我想根本问题是 JDBC 驱动程序可能只能将核心 java Date 类映射到 mysql 日期类型???

【问题讨论】:

【参考方案1】:

我可以建议您查看一个已经存在的解决方案,看看您是否也不能:

    在您自己的代码中使用它 用它作为例子来激发你的代码

http://joda-time.sourceforge.net/contrib/hibernate/index.html

我个人推荐 Joda Time 来满足您的时间/日期需求,并且已经有一个 Hibernate 桥可以满足您的需求。除非您使用 Joda Time,否则请查看上面的 URL,以及 hibernate 桥的代码,作为您应该如何编写转换器的说明。

【讨论】:

谢谢。我检查了该项目的源代码。自己写看起来很简单,但也许我现在还是坚持使用 JODA。【参考方案2】:

由于您的日期列有字符串,我想除了添加辅助方法进行转换之外别无他法。但是,当涉及时区时,最好以毫秒(长)为单位传递日期,这可以很容易地用于创建 Date 对象。然后可以根据需要应用时区。因此,请使用具有与 mysql 日期类型映射的标准 Date 类。

【讨论】:

自纪元以来传入毫秒与我想要做的完全相反。这代表了一个特定的时间实例。另外,理想情况下我不会使用 String。我将使用 JSR 310 的 LocalDate 或 JODA 时间等效项,它表示没有时间或时区的日期。 我将举一个例子说明为什么我不想传递日期。我得到一个日历实例,calendar.setTimeZone("Asia/Shanghai"), calendar.clear(), calendar.set(2011, Calendar.JULY, 23), myDomainObj.setDate(new java.sql.Date(calendar. getTimeInMillis()))。看起来很无辜。我正在日历中创建正确的日期。当我将它包装在 java.sql.Date 中时,它现在代表 7 月 22 日。当然这是一个错误,但为什么我什至想要有这样的错误的“机会”。我的简单日期应该与时区无关。 它在与 GMT 对应的默认时区中创建 Date 对象。因此,当您取回它时,您将应用适当的时区。这是一个代码sn-p。日历日历 = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone(("亚洲/上海")));日历.clear(); calendar.set(2011, Calendar.JULY, 23); java.sql.Date dt = new java.sql.Date(calendar.getTimeInMillis()); System.out.println (dt);日历 cal1 = Calendar.getInstance(TimeZone.getTimeZone(("亚洲/上海"))); cal1.setTime(dt); System.out.println("日历"+cal1.get(Calendar.DATE)); 是的,我知道 java.sql.Date 的 getter 使用导致此问题的 jvm 时区。但是您是否建议在数据库中将时间保留为 7 月 22 日,然后在将其从数据库中取出后添加时区更正?如果是这样,我将不得不强烈反对。如果您将数据库服务器移至欧洲会发生什么。现在你的整个数据库都是垃圾。

以上是关于JPA/Hibernate 将简单字符串或任意对象映射到 mysql 日期类型?的主要内容,如果未能解决你的问题,请参考以下文章

7. JPA - Hibernate

JPA/Hibernate 批量(批量)插入

Spring boot之 JPA/Hibernate/Spring Data

JPA Hibernate jpa spring data jpa

spring.jpa.hibernate.ddl-auto=validate 或更新返回 beans.factory.BeanCreationException

jpa hibernate中扫描太多实体时,glassfish启动很慢或内存泄漏