LocalDateTime不存储在数据库中

时间:2017-11-21 10:16:39

标签: 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();

}

2 个答案:

答案 0 :(得分:5)

参考链接How to persist LocalDate and LocalDateTime with JPA

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

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

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

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

例如,

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

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

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

答案 1 :(得分:0)

您好,如果您的唯一目的是审核,为什么不使用spring timestamps注释。

public abstract class BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@CreationTimestamp
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createdAt;

@UpdateTimestamp
@LastModifiedDate
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date updatedAt;