LocalDateTime不存储在数据库中

Rav*_*lor 4 mysql java-8 spring-data-jpa

我正在研究Spring数据JPA,我创建了一个实体,我在其中将Date作为LocalDateTime(Java 8).但是当存储在DB中时它不存储实际日期,它在DB中存储一些二进制类型值.

我应该在DB中使用LocalDateTime,如果不是,我应该何时使用这个java 8 date API.

实体文件: -

import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;

import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 
 * @author Ravat
 *
 */

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    //@CreatedDate
    @Column(name = "created_date", updatable = false)
    private LocalDateTime createdDate = LocalDateTime.now();

    //@LastModifiedDate
    @Column(name = "updated_date")
    private LocalDateTime updatedDate = LocalDateTime.now();

}
Run Code Online (Sandbox Code Playgroud)

Par*_*tal 5

参考链接如何使用JPA持久化LocalDate和LocalDateTime

JPA会将其映射到BLOB而不是DATE或TIMESTAMP.这意味着数据库不知道日期对象,也无法对其应用任何优化.这不是我们应该或想要做的方式.

但这并不意味着您无法使用日期和时间API.您只需决定如何添加对它的支持.

如果要在DATE列中存储LocalDate属性或在TIMESTAMP列中存储LocalDateTime,则需要自己定义到java.sql.Date或java.sql.Timestamp的映射.

由于属性转换器是JPA 2.1中的几个新功能之一,只需几行代码就可以实现,这可以在这里的帖子中看到.

例如,

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements
        AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate locDate) {
        return (locDate == null ? null : Date.valueOf(locDate));
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
        return (sqlDate == null ? null : sqlDate.toLocalDate());
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要使用convertToDatabaseColumn和convertToEntityAttribute这两个方法实现AttributeConverter接口.正如您在方法名称上看到的,其中一个定义了从实体属性(LocalDate)的类型到数据库列类型(Date)的转换,另一个定义了逆转换.转换本身非常简单,因为java.sql.Date已经提供了与LocalDate进行转换的方法.

此外,属性转换器需要使用@Converter注释进行注释.由于可选的autoApply = true属性,转换器将应用于LocalDate类型的所有属性