Spring Boot - created_at не может иметь значение null. Весна JPA

1

Всякий раз, когда я пытаюсь сохранить объект в своей БД, я получаю сообщение об ошибке. Столбец created_at не может быть нулевым.

Вот моя модель аудита:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(
        value = {"createdAt", "updatedAt"},
        allowGetters = true
)
public abstract class AuditModel implements Serializable {
    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    @Column(name = "created_at", nullable = false, updatable = false)
    @JsonIgnore
    private Date createdAt;

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

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    public Date getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }
}

Вот пример расширяющей его модели:

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.lang.Nullable;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Set;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Category extends AuditModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty(message = "Item Name is required.")
    private String categoryName;
    @NotNull
    private String categoryDescription;
    @Nullable
    @JsonIgnore
    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<Item> items;

    public Category(String categoryName, String categoryDescription) {
        this.categoryName = categoryName;
        this.categoryDescription = categoryDescription;
    }

А вот временный bean-компонент CommandLine, который выполняет за меня несколько тестов:

@Configuration
public class ItemConfig {

    @Autowired
    ItemRepository itemRepository;
    @Autowired
    CategoryRepository categoryRepository;

    @Value("${STORE.ENV}")
    private String env;

    @Bean
    CommandLineRunner itemRunner(ItemRepository itemRepository) {
        return args -> {

            System.out.println("true");
            Category cueCategory = new Category
                    ("Cues",
                     "This category contains all items relating to billiard cues. This includes yada, yadada, and yada."
                    );
            categoryRepository.save(cueCategory);

            Item item = new Item("Test Cue", 700, cueCategory);
            itemRepository.save(item);
        };
    }
}

Сначала я создавал пустой объект, а затем устанавливал все значения с помощью сеттеров. Я подумал, что, возможно, все это должно произойти одним ударом Скверны, чтобы created_at зарегистрировался с правильной датой, поэтому я добавил несколько конструкторов. Это все еще не сработало. Пожалуйста, дайте мне знать, если увидите что-нибудь яркое!

1
  • Кстати, Hibernate уже давно поддерживается Instant; используйте его вместо того, Dateкогда это возможно. 2 дня назад
1

Вы должны добавить @EnableJpaAuditingаннотацию.

import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
// ...

@Configuration
@EnableJpaAuditing
public class ItemConfig {
    // ...
}
0

Вы можете решить эту проблему, изменив свойства createdAt и updatedAt, как показано ниже, а также изменив методы получения и установки.

@CreationTimestamp
@Column(name = "created_at", updatable = false)
private Timestamp createdAt;

@UpdateTimestamp
@Column(name = "updated_at")
private Timestamp updatedAt;
Новый участник
NARASIMHA RAO NANDIKONDA is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.