我正在研究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();
}
答案 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;