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)
参考链接如何使用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类型的所有属性
| 归档时间: |
|
| 查看次数: |
2388 次 |
| 最近记录: |