【发布时间】:2019-11-01 00:43:34
【问题描述】:
我正在使用 Spring data jpa 和 mariadb 最新版本,以及 MariaDB 10.3.16
+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.1.5.RELEASE
...
| +--- org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE
...
| +--- org.hibernate:hibernate-core:5.3.10.Final
这是我的实体:
@Entity
@Data
@Table
@NoArgsConstructor
@AllArgsConstructor
public class Note {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;
@Column
private String gsn;
@Column
@Enumerated(EnumType.STRING)
private NoteType type;
@Column
private String text;
@Column
private ZonedDateTime scheduleDt;
@Column
@CreationTimestamp
private Instant createDt;
@Column
@UpdateTimestamp
private ZonedDateTime updateDt;
}
当我持久化我的实体时,Hibernate 会尝试将 ZonedDateTime 成员保存为 DATETIME 列。但我想使用 TIMESTAMP 列而不是 DATETIME 列。
这是创建 DDL,我从日志中看到的。
create table `note` (`id` integer not null, `create_dt` datetime,
`gsn` varchar(255), `schedule_dt` datetime, `text` varchar(255),
`type` varchar(255), `update_dt` datetime, primary key (`id`))
engine=MyISAM
这里create_dt、schedule_dt、update_dt 被创建为datetime 列类型,这不是我想要的。 (我也不喜欢 MyISAM)。
我该如何解决?
由于注释无法表达ddl而添加。
当我使用 columnDefinition 属性时,生成的 ddl 是 ...
create table `note` (`id` integer not null, `create_dt` datetime,
`gsn` varchar(255), `schedule_dt` datetime, `text` varchar(255),
`type` varchar(255), `update_dt` `TIMESTAMP`, primary key (`id`))
engine=MyISAM
TIMESTAMP 周围有不需要的“`”。
【问题讨论】:
-
不是很相关,但为什么要使用 ZonedDateTime 而不是 Instant 或 LocalDateTime?时间戳不会在任何地方存储存储在 ZonedDateTime 中的时区,因此您将无法使用原始时区取回 ZonedDateTime。
-
@JB 是的,你是对的。时区不可恢复。无论如何 Instant,LocalDateTime 也不起作用。生成的 DDL 使用 DATETIME 列类型。
-
@galex:您的内联代码格式更改很好,但软件名称和版本并没有通过将它们加粗来提高可读性。一般来说这是没有必要的。
-
好的,谢谢你的建议,我是stackoverflow的新手
-
与问题无关,但永远不要将 lombok 的 Data 或 EqualsAndHashcode 用于实体。您可以检查反编译的文件:lombok 不理解实体。实体不是价值对象。 Lombok 对 equals 和 hascode 的实现既不正确,又是潜在的性能杀手。检查例如@vlad-mihalcea blog vladmihalcea.com/… 以获得正确的实施。
标签: java hibernate jpa mariadb zoneddatetime