Tit*_*ito 12 postgresql hibernate java-8 hibernate-5.x
我有一个正在运行的应用程序spring boot 1.3 + hibernate 5 + java 8 + ZonedDateTime + postgresql并且在其中一个表中我有以下字段.
@Column(name = "DATE_ENABLED")
@Type(type="java.time.ZonedDateTime")
private ZonedDateTime dateEnabled;
@Column(name = "DATE_DISABLED")
@Type(type="java.time.ZonedDateTime")
private ZonedDateTime dateDisabled;
Run Code Online (Sandbox Code Playgroud)
如果我运行该应用程序,那么我发现默认情况下会生成"没有时区的时间戳"
testDB=# \d type
Table "public.type"
Column | Type | Modifiers
--------------------------------+-----------------------------+-----------
type_id | bytea | not null
date_disabled | timestamp without time zone |
date_enabled | timestamp without time zone |
Run Code Online (Sandbox Code Playgroud)
我知道如果我将columnDefinition ="TIMESTAMP WITH TIME ZONE"添加到列中,例如
@Column(name = "DATE_DISABLED", columnDefinition= "TIMESTAMP WITH TIME ZONE")
Run Code Online (Sandbox Code Playgroud)
然后它正常工作,我能够看到hibernate创建了一个带有时区的列,但是如果我正确理解这将只适用于postgres,即如果我明天将数据库更改为mysql,则hibernate将抛出错误.
因此,我的问题是如何一般地这样做,即告诉hibernate创建一个应包括时区和偏移量的列.我认为,由于故意创建java类型"ZonedDateTime"以包括时区和UTC时间偏移,因此hibernate默认会创建一个包含时区的列.因此问题再次出现:告诉hibernate包含时区和偏移的正确方法是什么.
这是我的pom的一部分:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
<hibernate.version>5.0.4.Final</hibernate.version>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
和我的属性文件显示方言
@Bean
public Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
setProperty("hibernate.chach.provider_class", "org.hibernate.cache.NoCacheProvider");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.hbm2ddl.auto", "create-drop");
}
};
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 Hibernate 创建模式,这个问题似乎只是一个障碍。因此,如果在像timestamp with time zone在 PostgreSQL 上一样创建列后一切正常,请继续。无论如何,让 Hibernate 生成您的架构是一种不好的做法。手动执行(或让 DBA 执行此操作)。如果你想实现自动化,使用类似于数据库迁移工具迁飞或Liquibase后一个可靠的人写的SQL脚本。
除此之外,“明天更改数据库”的要求听起来确实是虚构的,独立于数据库的工作或多或少是不现实的,并且在编写必须执行的更大应用程序时变得更加困难。
如果您需要有关 Hibernate / JDBC 时间戳行为的更多信息,请查看这篇关于它的好文章。
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |