В SpringBoot, как правильно аннотировать поля со значением по умолчанию - PullRequest
0 голосов
/ 25 апреля 2020

Я новичок в 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()...
}

Определение таблицы ниже (скрипт, сгенерированный 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;

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);
}

возвращает

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. Я не знаю, почему я получаю ошибку.

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 апреля 2020
`date_added` datetime NOT NULL DEFAULT current_timestamp()

ПО УМОЛЧАНИЮ не защищает от null. В простом SQL, если вы установите date_added = null, столбец будет нулевым и, следовательно, будет выдана ошибка.

Значение по умолчанию работает только в тех случаях, когда вы делаете что-то вроде insert into mactype(credential_type_id, credential_type_name) values (.., ..) и не указываете столбец, для которого вы указали значение по умолчанию.

В вашем случае вы можете использовать аннотированные методы @PrePersist и @PreUpdate в своем классе сущности.

0 голосов
/ 27 апреля 2020

Добавление inserttable = false удалит столбец, добавляемый в сценарий вставки, созданный hibernate (но будет доступен для выбора), и будет использоваться значение по умолчанию для базы данных.

 @Column(name="date_added", insertable = false)
 private LocalDateTime dateAdded;
0 голосов
/ 25 апреля 2020

При вставке данных в базу данных date_added значение равно null. Означает запрос вставки, выполненный как

insert into mactyp(.., date_added,...) values (..,null, ..)

Итак, этим запросом вы пытаетесь установить нулевое значение в ненулевое поле. Вот почему ошибка говорит:

Column 'date_added' cannot be null

Значение по умолчанию mysql будет применяться, когда вы не пытаетесь вставить столбец с помощью запроса.

Используйте @CreationTimestamp в столбце для установки текущая отметка времени в запросе.

@CreationTimestamp
private LocalDateTime dateAdded;

Подробнее см. здесь

...