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

Mysql 在SpringBoot中,用默认值注释字段的正确方法是什么,mysql,spring-boot,spring-data-jpa,mysql-workbench,spring-boot-test,Mysql,Spring Boot,Spring Data Jpa,Mysql Workbench,Spring Boot Test,我是新穿春靴的。我正在尝试使用Spring工具套件和Mysql工作台创建一个应用程序,它使用JPA、MysqlConnectorJ作为依赖项 我有一个名为CredentialType的实体 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import

我是新穿春靴的。我正在尝试使用Spring工具套件和Mysql工作台创建一个应用程序,它使用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()...
}
Mysql工作台生成的脚本下面的表定义

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;
添加的日期列默认值为当前时间戳

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

@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);
}
它回来了

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
我原以为它会自动在Mysql中插入datetime/时间戳。我不知道为什么我会出错

多谢各位

`date_added` datetime NOT NULL DEFAULT current_timestamp()
默认值不防止null。在普通SQL中,如果将date_added设置为null,则该列将为null,因此将抛出错误

默认值仅在您执行诸如插入mactypecredential\u type\u id、credential\u type\u name值等操作的情况下有效。。并且不要指定已为其指定默认值的列

在您的情况下,您可以在实体类中利用@PrePersist和@PreUpdate注释方法

默认值不防止null。在普通SQL中,如果将date_added设置为null,则该列将为null,因此将抛出错误

默认值仅在您执行诸如插入mactypecredential\u type\u id、credential\u type\u name值等操作的情况下有效。。并且不要指定已为其指定默认值的列


在您的情况下,您可以在实体类中利用@PrePersist和@PreUpdate注释的方法。

当数据库中插入的数据date\u附加值为空时。 表示插入查询的执行方式与

insert into mactyp(.., date_added,...) values (..,null, ..)
所以,通过这个查询,您试图在NOTNULL字段上设置null值。 这就是为什么错误会说

Column 'date_added' cannot be null
当您不尝试使用查询插入列时,将应用mysql默认值

在列上使用@CreationTimestamp设置查询中的当前时间戳

@CreationTimestamp
private LocalDateTime dateAdded;

当数据库中插入的数据日期添加值为空时,查找更多详细信息。 表示插入查询的执行方式与

insert into mactyp(.., date_added,...) values (..,null, ..)
所以,通过这个查询,您试图在NOTNULL字段上设置null值。 这就是为什么错误会说

Column 'date_added' cannot be null
当您不尝试使用查询插入列时,将应用mysql默认值

在列上使用@CreationTimestamp设置查询中的当前时间戳

@CreationTimestamp
private LocalDateTime dateAdded;

查找更多详细信息

添加insertable=false将删除由hibernate生成的插入脚本中添加的列,但可用于select,并将使用数据库默认值

 @Column(name="date_added", insertable = false)
 private LocalDateTime dateAdded;

Adding insertable=false将删除由hibernate生成的插入脚本中添加的列,但可用于select,并使用数据库默认值

 @Column(name="date_added", insertable = false)
 private LocalDateTime dateAdded;
对于日期字段,可以使用以下注释:

@Temporal(TemporalType.TIMESTAMP)
@CreationTimestamp
@Column(name = "created_at", nullable = false)
private Date createdAt;

@Temporal(TemporalType.TIMESTAMP)
@UpdateTimestamp
@Column(name = "updated_at", nullable = true)
private Date updatedAt;
对于日期字段,可以使用以下注释:

@Temporal(TemporalType.TIMESTAMP)
@CreationTimestamp
@Column(name = "created_at", nullable = false)
private Date createdAt;

@Temporal(TemporalType.TIMESTAMP)
@UpdateTimestamp
@Column(name = "updated_at", nullable = true)
private Date updatedAt;