2017-12-18 248 views
0

我有一个奇怪的问题JPA映射失败转换为时间戳,但它使用的值似乎是整个行,而不仅仅是一个变量。JPA映射失败的奇怪消息

的错误是:

java.sql.SQLException: Value '1988├╗ ├╗├╗├╗├╗├╗├╗0 
07 1234567 wk├╗0├╗├╗├╗├╗├╗            ' can not be represented as java.sql.Timestamp 

其中值似乎是整行,大部分坏字符是空的。调试日志记录目前没有给我太多,我不确定它是否是我的映射类错误,整理问题或其他。

MySQL工作台正确读取表中的所有信息。从命令运行mysql会正确输出所有数据。任何地方都不能显示任何特殊字符。

我的映射类的简化版本是:

@Entity 
@Audited 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class PersonSundry { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="person_id", unique=true) 
    private Person person; 

    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup1 lookup1; 
    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup2 lookup2; 

    @Lob 
    private String backgroundInfo; 
    private LocalDate dateOfSomething1; 
    private LocalDate dateOfSomething2; 
    private LocalDate dateOfSomething3; 

    // getters and setters 
} 

有没有人遇到过吗?任何想法在哪里看?

编辑:根本原因竟然是00-00-0000到时间戳的通用失败演员,但是我打算留下问题打开,看看是否有人知道给出奇怪的错误消息的地方确切的一个。

+0

用户执行一些操作,并将SQL发送到数据库。该SQL打印在JPA提供程序日志中。为什么不看它呢? – DN1

+0

您是否为Hibernate添加了Java 8支持?由于JPA 2.1不支持开箱即用的java 8日期时间API –

+0

您能否显示代码如何坚持(如果坚持java)并找到失败的行?数据库中LocalDate的数据类型是什么? – pirho

回答

0

您使用的是MYSQL吗? 请尝试使用这种类型的连接字符串。

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull 

带有全零组件的日期时间(0000-00-00 ...) - 这些值在Java中不能可靠地表示。 Connector/J 3.0.x在从ResultSet读取时总是将它们转换为NULL。

当遇到这些值时,Connector/J 3.1默认会引发异常,因为根据JDBC和SQL标准,这是最正确的行为。可以使用zeroDateTimeBehavior配置属性修改此行为。允许的值为:

异常(缺省值),它引发SQLException与S1009的SQLState。

convertToNull,它返回NULL而不是日期。

round,将日期舍入到最接近的最接近的值0001-01-01。

+0

这会导致MySQL隐式执行转换。但我想知道的是为什么错误信息是不正确的。 –

+0

具有全零分量的日期时间(0000-00-00 ...) - 这些值在Java中不能可靠地表示。 Connector/J 3.0.x在从ResultSet读取时总是将它们转换为NULL。 当遇到这些值时,Connector/J 3.1默认会引发异常,因为根据JDBC和SQL标准,这是最正确的行为。可以使用zeroDateTimeBehavior配置属性修改此行为。 – Sirsendu