在MySQL中持久化java LocalDate

时间:2015-03-06 10:56:13

标签: java mysql jpa jdbc mysql-connector

我正在编写一个java客户端应用程序,使用:SE 8,MySQL 5.6(Connector / J 5.1),JPA 2.1。当我尝试持有具有ID(int自动增量),date(LocalDate)的实体时。抛出异常说:

Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '\xAC\xED\x00\x05sr\x00\x0Djava.time.Ser\x95]\x84\xBA\x1B"H\xB2\x0C\x00\x00xpw\x07\x03\x00\x00\x07\xDF\x03\x06x' for column 'date' at row 1

MySQL(我的意思是连接器)不支持新的日期和时间API或什么。如果是这样我该怎么办?

@Entity
@Table(schema="app")
public class Run implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;                     //number of connections

    private LocalDate date;

4 个答案:

答案 0 :(得分:10)

注册自定义转换器可以帮助您解决问题

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
    AttributeConverter<LocalDate, Date> {
    @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();
    }
}

有关转换LocalDate info的更多信息以及有关使用converters

的更多信息

答案 1 :(得分:6)

AttributeConverter也是通用的:

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
        AttributeConverter<LocalDate, Date> {
    @Override
    public Date convertToDatabaseColumn(LocalDate entityValue) {
        return java.sql.Date.valueOf(entityValue);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date databaseValue) {
        return databaseValue.toLocalDate();
    }

}

答案 2 :(得分:2)

如果使用hibernate,我刚刚发现here,也可以利用Java 8支持,该文件位于一个名为hibernate-java8.jar的独立jar文件中。所以基本上你可以在你的pom中添加这样的东西并准备好了:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
</dependency>

答案 3 :(得分:1)

更短:

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate attribute) {
        return valueOf(attribute);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date dbData) {
        return dbData.toLocalDate();
    }
}