2016-01-19 18 views
0

У меня есть объект домена со свойствами, указанными ниже, после отправки формы только имя завершения связывается с вводом формы, а dateRaised - null. Нет ошибок, кроме ошибок проверки. Я попытался изменить тип dateRaised на java.time.LocalDate, и он отлично работает. Является ли привязка к java.time.LocalDateTime уже поддерживаемой?Spring java.time.LocalDateTime binding issue

@NotNull 
@Column(name = "date_raised", nullable = false) 
@DateTimeFormat(iso = ISO.DATE_TIME) 
private java.time.LocalDateTime dateRaised; 

@Column(name = "completion_date") 
@DateTimeFormat(iso = ISO.DATE) 
private java.time.LocalDate completionDate; 

ответ

0

Чтобы преобразовать даты, вам необходимо будет ввести AttributeConverter<EntityType, DatabaseType>.

Следующий блог, Thoughts on Java по Thorben Janssen, объясняет, как хранить атрибут LocalDate в DATE колонки или LocalDateTime в TIMESTAMP колонки.

How to persist LocalDate and LocalDateTime with JPA

JPA 2.1 был выпущен перед тем Java 8, и поэтому не поддерживает новые даты и времени API. Если вы хотите использовать новые классы (правильно), вам необходимо определить преобразование в java.sql.Date и java.sql.Timestamp самостоятельно. Это можно легко сделать, реализовав интерфейс AttributeConverter<EntityType, DatabaseType> и аннотируя класс @Converter(autoApply=true). Установив autoApply=true, преобразователь будет применен ко всем атрибутам EntityType, и никаких изменений в сущности не требуется.

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

Преобразование атрибута является прозрачным для разработчика и атрибут LocalDate может быть использован в качестве любого другого атрибута объекта. Вы можете использовать его как параметр запроса, например.

LocalDate date = LocalDate.of(2015, 8, 11); 
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class); 
query.setParameter("start", date.minusDays(2)); 
query.setParameter("end", date.plusDays(7)); 
MyEntity e = query.getSingleResult();