在SpringBoot中,用默认值注释字段的正确方法是什么

jor*_*dan 2 mysql mysql-workbench spring-data-jpa spring-boot spring-boot-test

我是 Spring Boot 的新手。我正在尝试使用 Spring Tool Suite 和 Mysql Workbench 创建一个应用程序,该应用程序使用 JPA、MysqlConnectorJ 作为依赖项。

我有一个名为“CredentialType”的实体

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "mactyp")
public class CredentialType {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="credential_type_id")
    private Long id;
    @Column(name="credential_type_name")
    private String name;
    @Column(name="date_added")
    private LocalDateTime dateAdded;
    @Column(name="date_modified")
    private Date dateLastModified;
    @Column(name="is_active")
    private boolean isActive;

    ...getters() and setters()...
}
Run Code Online (Sandbox Code Playgroud)

下面的表定义(由 Mysql Workbench 生成的脚本)

CREATE TABLE `mactyp` (
  `credential_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `credential_type_name` varchar(45) NOT NULL,
  `date_added` datetime NOT NULL DEFAULT current_timestamp(),
  `date_modified` datetime DEFAULT NULL,
  `is_active` bit(1) NOT NULL DEFAULT b'1',
  PRIMARY KEY (`credential_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
Run Code Online (Sandbox Code Playgroud)

date_added列默认值为current_timestamp

但是,当我尝试运行下面的测试时,

@Test
public void testCreateCredentialType() {
    //DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    //LocalDateTime now = LocalDateTime.now();
    //System.out.println(dtf.format(now));

    CredentialType credentialType = new CredentialType();
    credentialType.setName("Application");
    //credentialType.setDateAdded(now);

    credentialTypeRepository.save(credentialType);
}
Run Code Online (Sandbox Code Playgroud)

它返回

2020-04-26 01:09:23.962  WARN 8352 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1048, SQLState: 23000
2020-04-26 01:09:23.962 ERROR 8352 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'date_added' cannot be null
Run Code Online (Sandbox Code Playgroud)

我期望它会自动在 Mysql 中插入日期时间/时间戳。我不知道为什么会收到错误。

谢谢。

Kum*_*r V 5

添加 insertable = false 将删除在 hibernate 生成的插入脚本中添加的列(但可用于选择),并且将使用数据库默认值。

 @Column(name="date_added", insertable = false)
 private LocalDateTime dateAdded;
Run Code Online (Sandbox Code Playgroud)