【问题标题】:persist java LocalDate in MySQL在 MySQL 中持久化 java LocalDate
【发布时间】:2015-05-07 23:17:33
【问题描述】:

我正在使用 SE 8、MySQL 5.6 (Connector/J 5.1)、JPA 2.1 编写 Java 客户端应用程序。当我尝试使用 ID(int Auto-increment)、日期(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;

【问题讨论】:

  • 对 sql 相关的日期使用 java.sql.Date 吗?

标签: java mysql jpa jdbc mysql-connector


【解决方案1】:

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

@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

【讨论】:

  • 这正是我锁定的目的,非常感谢伙计
  • np,很高兴它有帮助:)
  • 它应该是通用的并带有空检查
【解决方案2】:

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

}

【讨论】:

  • 别忘了空检查,空入就是空出
【解决方案3】:

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

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

【讨论】:

  • 我使用 EclipseLink 不是休眠
  • 好吧,没意识到,只是觉得有人可能会使用这种方法
猜你喜欢
  • 2021-03-30
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多