坚持使用hibernate和java

时间:2017-10-18 16:30:59

标签: java hibernate jpa

(Spring app - MVC) 我用列定义了一个表:

`time` TIME NOT NULL,

在实体类中我有:

@Getter @Setter
@NotNull
private java.sql.Time time;

在我的DTO课程中,我有:

@Getter @Setter
private java.sql.Time time;

当我从邮递员发送"time": "12:10"时,我得到: com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class java.sql.Time] value failed: null (through reference chain: (<points to a field (of java.sql.Time) in my aforementioned DTO class>))

当我在MySQL中有TIMESTAMP时,在dto和实体中都有java LocalTime,那么它可以工作,但它会持续时间和日期。我想只有时间。

我走过了前面不同的话题f.e. Joda-Time-Hibernate所以我使用LocalTime(在dto和实体中)注释@Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime"),但它没有用。

有人可以帮助我,dto,entity,table的专栏有哪些正确的类型(仅限时间),所以jackson可以序列化,hibernate理解并坚持。

1 个答案:

答案 0 :(得分:0)

至于序列化,您必须将其添加到application.properties

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

这样您就可以使用简单的日期表单映射(Java8要求)

我用LocatDate

作为birthday存储的内容

Dependecy:

compile('org.hibernate:hibernate-java8:5.0.12.Final')

在实体类

@Column
private LocalDate birthday;

无需其他配置。我在数据库中得到了什么:

enter image description here

birthday的类型为date

enter image description here

要使用Instant

的日期和时间
@Data
@MappedSuperclass
public abstract class TimestampedEntity extends AbstractEntity {

    @Column(updatable = false)
    @Setter(value = AccessLevel.PRIVATE)
    private Instant createdAt;

    @Column
    @Setter(value = AccessLevel.PRIVATE)
    private Instant modifiedAt;

    @PrePersist
    private void beforeCreation() {
        this.setCreatedAt(Instant.now());
    }

    @PreUpdate
    private void beforeUpdate() {
        this.setModifiedAt(Instant.now());
    }

}

,这在数据库中以Timestamp的形式存在。

PS。我正在使用Spring + JPA + Hibernate + MySQL