2017-12-18 250 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