java jpa中year函数_JPA对Java 8新日期和时间API的支持

JPA对Java 8新日期和时间API的支持

我将Java 8用于新项目。

我正在尝试在Java 8中使用新的日期和时间api,但是我不知道JPA 2.1是否完全支持此新的日期和时间API。

请分享您在JPA对Java 8中新的日期和时间API的支持中的经验/意见。

我可以通过JPA 2.1安全地在Java 8中使用新的日期和时间api吗?

更新:

我正在使用Hibernate(4.3.5.Final)作为JPA实现。

8个解决方案

71 votes

对于Hibernate 5.X,只需添加

org.hibernate

hibernate-java8

${hibernate.version}

@NotNull

@Column(name = "date_time", nullable = false)

protected LocalDateTime dateTime;

无需任何额外努力即可工作。参见[https://hibernate.atlassian.net/browse/HHH-8844]

更新:

请看一下Jeff Morin的评论:从Hibernate 5.2.x开始就足够了

org.hibernate

hibernate-core

5.2.1.Final

org.springframework

spring-...

4.3.1.RELEASE

参见[https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide---5.2]和将Hibernate 5.2与Spring框架4.x集成

GKislin answered 2019-11-18T01:20:15Z

19 votes

JPA 2.1是Java 1.8之前的规范,因此不要求对其提供任何支持。 显然,某些实现可能支持某些Java 1.8功能。 有些使用Java 1.8字节码有问题(例如EclipseLink)。 我知道DataNucleus支持java.time和Java 1.8,因为那是我使用的那个。 您必须检查实现的支持水平。

已要求JPA 2.2支持java.time类型,请参见此问题[https://java.net/jira/browse/JPA_SPEC-63]

Neil Stockton answered 2019-11-18T01:19:28Z

11 votes

JPA 2.2支持java.time

JPA 2.2现在支持LocalDate、Duration、Instant、ZonedDateTime和OffsetDateTime。

javax.persistence

javax.persistence-api

2.2

对于JPA 2.2实现,可以使用Hibernate 5.2或EclipseLink 2.7。

与JPA 2.2相比,Hibernate 5支持更多的Java类型,例如Duration、Instant和ZonedDateTime。

更多信息:

如何使用JPA 2.2映射日期和时间API,作者Thorben Janssen

JPA 2.2的新增功能

JSR 338(维护版本)

JPA 2.2 Wiki

TheKojuEffect answered 2019-11-18T01:21:31Z

9 votes

我在项目中使用Java 8,EclipseLink(JPA 2.1),PostgreSQL 9.3和PostgreSQL驱动程序-Postgresql-9.2-1002.jdbc4.jar,并且可以使用新API中的LocalDateTime变量,但该列的数据类型没有问题 是数据库中的bytea,所以据我所知,您只能从Java应用程序读取它。 您可以使用AttributeConverter将新类转换为java.sql.Date我从Java.net找到了这段代码

@Converter(autoApply = true)

public class LocalDatePersistenceConverter implements

AttributeConverter {

@Override

public java.sql.Date convertToDatabaseColumn(LocalDate entityValue) {

return java.sql.Date.valueOf(entityValue);

}

@Override

public LocalDate convertToEntityAttribute(java.sql.Date databaseValue) {

return databaseValue.toLocalDate();

}

Ismael_Diaz answered 2019-11-18T01:21:57Z

9 votes

org.jadira.usertype可用于保留JSR 310 Date and Time API。

查看这个示例项目。

在示例项目中,

@MappedSuperclass

public class AbstractEntity {

@Id @GeneratedValue Long id;

@CreatedDate//

@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//

ZonedDateTime createdDate;

@LastModifiedDate//

@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")//

ZonedDateTime modifiedDate;

}

TheKojuEffect answered 2019-11-18T01:22:34Z

3 votes

我知道这是一个古老的问题,但是我想到了一个可能有用的替代解决方案。

可以尝试使用@Transient来代替将新的java.time。*类映射到现有数据库类型:

@Entity

public class Person {

private Long id;

private Timestamp createdTimestamp;

@Id

@GeneratedValue

public Long getId() { return id; }

private Timestamp getCreatedTimestamp() {

return createdTime;

}

private void setCreatedTimestamp(final Timestamp ts) {

this.createdTimestamp = ts;

}

@Transient

public LocalDateTime getCreatedDateTime() {

return createdTime.getLocalDateTime();

}

public void setCreatedDateTime(final LocalDateTime dt) {

this.createdTime = Timestamp.valueOf(dt);

}

}

您可以使用使用新的Java 8日期/时间类的公共getter / setter方法,但在幕后,getter / setter可以使用旧的日期/时间类。 当您保留实体时,遗留的date / time属性将保留,但新的Java 8属性将保留,因为它使用@Transient注释。

Jin Kim answered 2019-11-18T01:23:12Z

1 votes

对于TIMESTAMP类型,可以使用此转换器:

@Converter(autoApply = true)

public class LocalDateTimeAttributeConverter implements AttributeConverter {

@Override

public Timestamp convertToDatabaseColumn(LocalDateTime datetime) {

return datetime == null ? null : Timestamp.valueOf(datetime);

}

@Override

public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {

return timestamp == null ? null : timestamp.toLocalDateTime();

}

}

对于DATE类型,您可以使用以下转换器:

@Converter(autoApply = true)

public class LocalDateAttributeConverter implements AttributeConverter {

@Override

public Date convertToDatabaseColumn(LocalDate date) {

return date == null ? null : Date.valueOf(date);

}

@Override

public LocalDate convertToEntityAttribute(Date date) {

return date == null ? null : date.toLocalDate();

}

}

对于TIME类型,可以使用此转换器:

@Converter(autoApply = true)

public class LocalTimeAttributeConverter implements AttributeConverter {

@Override

public Time convertToDatabaseColumn(LocalTime time) {

return time == null ? null : Time.valueOf(time);

}

@Override

public LocalTime convertToEntityAttribute(Time time) {

return time == null ? null : time.toLocalTime();

}

}

Paco answered 2019-11-18T01:23:51Z

0 votes

有很多方法可以做,这还取决于您的框架工作:如果您的框架在Field Converter上有这样的弹簧,请这样做:1-

@DateTimeFormat(pattern = "dd.MM.yyyy - HH:mm")

private Long createdDate;

这里我使用的是旧的时代格式[https://www.epochconverter.com/]纪元是非常灵活和可接受的格式

2-其他方法是使用jpa @PostLoad @PreUpdate @PrePersist

@PostLoad

public void convert() {

this.jva8Date= LocalDate.now().plusDays(1);

}

或使用这样的临时

@Transient

public LocalDateTime getCreatedDateTime() {

return createdTime.getLocalDateTime();

}

Ali.Mojtehedy answered 2019-11-18T01:24:37Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值