2017-03-28 15 views
14

hibernate-java8 JAR cung cấp adapter cho một vài lớp học như Instant, LocalDate, vv, nhưng một số lớp học từ java.time, ví dụ, Year, Month, YearMonth đang thiếu. Các lớp này được lưu trữ như một số chưa biết Serializable, không cần thiết lãng phí.Hibernate serialize java.time.year và những người khác

Chắc chắn tôi có thể sử dụng int year thay vì Year year, nhưng tôi không nghĩ, đó là một ý tưởng hay.

Dường như viết YearJavaDescriptor sẽ khá dễ dàng, tuy nhiên, tôi tự hỏi tại sao nó thiếu. Đặc biệt là trong trường hợp của YearMonth, tôi rất muốn có một bộ điều hợp hiện có, ist có bất kỳ? Hay tôi đang làm điều gì đó ngu ngốc?

Tôi không chắc chắn vì googling không trả về gì cả.

+1

Tôi nghĩ rằng đây trả lời vấn đề của bạn: http://stackoverflow.com/questions/40825495/java-time-yearmonth-as-a-type -within-entity – LLL

+1

Một lời khuyên khi sắp xếp/mã hóa một loại như 'YearMonth'. [Hãy suy nghĩ về số liệu thống kê cơ sở dữ liệu của bạn] (https://blog.jooq.org/2016/10/05/why-you-should-design-your-database-to-optimise-for-statistics/), và có lẽ tránh được định dạng có thể đọc được của con người có lợi cho một định dạng tốt hơn. –

+0

@LukasEder Cảm ơn bạn, tôi đã đọc blog của bạn. IIUIC, bạn nên đề xuất một số thứ như 'tháng từ năm 2000' hoặc' DATE ('2017-03-01') 'thay vì' '2017-03'' hoặc '201703' để thống kê hoạt động tốt hơn. Thật đáng tiếc là các cơ sở dữ liệu không có các kiểu tùy chỉnh với 'toString' /' fromString', vì vậy chúng ta có thể có cả khả năng đọc và tốc độ. – maaartinus

Trả lời

4

Nếu nhà cung cấp JPA của bạn không tồn tại một kiểu hợp lý (trong trường hợp này bởi vì nó là một lớp Java8, được thêm vào sau khi JPA 2.1 được chấp thuận) thì bạn cần xác định JPA 2.1 AttributeConverter để chuyển đổi nó thành một loại JPA tiêu chuẩn bền vững (trong trường hợp này là một cái gì đó giống như java.sql.Date).

+0

Đó là java 8, nhưng tôi đang sử dụng Jibernate-java8 JAR. – maaartinus

8

Cố gắng tạo trình chuyển đổi - AttributeConverter triển khai cho mục đích này.

tôi được sử dụng trong một cái gì đó trong quá khứ như sau:

@Entity 
public class RealEstateAgency { 
    @Column(name = "createdAt") 
    @Convert(converter = ZonedDateTimeConverter.class) 
    private ZonedDateTime creationDate; 
} 

@Converter(autoApply = true) 
public class ZonedDateTimeConverter implements AttributeConverter<ZonedDateTime, Date> { 
  
    public Date convertToDatabaseColumn(ZonedDateTime toConvert) { 
     return toConvert == null ? null : Date.from(toConvert.toInstant()); 
    } 
  
    public ZonedDateTime convertToEntityAttribute(Date toConvert) { 
     return toConvert == null ? null : ZonedDateTime.from(toConvert 
       .toInstant()); 
    } 
} 
Các vấn đề liên quan