2012-12-19 49 views
13

在我的Java程序..Hibernate Bean類定義一個列如..如何在Mysql數據庫中避免'數據被截斷'使用java?

TimtableVO.java

@Column(name="REPEAT_DAYS") 
private WeekdayType repeatDays;//hear WeekdayType is Enum Class 

在我的服務類我使用這個TimetableVO.java bean類的。 。

這是我的服務類:

public void createEvent(TimetableVO timetableVO) { 
    WeekdayType weekday = null; 
    for (String day : timetableVO.getTemp().split(",")) { 
     weekday = WeekdayType.valueOf(day); 
    } 
    timetableVO.setRepeatDays(weekday); 
    userDAO.createEvent(timetableVO); 
} 

我的DAO類我是我nserting timetableVO對象..

public void createEvent(TimetableVO timetableVO) throws DataAccessException { 
    entityManager.persist(timetableVO); 
} 

但是異常會..

Exception: Caused by: java.sql.BatchUpdateException: Data truncated for column 'REPEAT_DAYS' at row 1 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2045) 
    at coHibernate: insert into EC_TIMETABLE (CLASS_DURATION, COURSE_DURATION, COURSE_FEE, END_DATE, REPEAT_COUNT, REPEAT_DAYS, REPEAT_TYPE, SEARCH_KEY, START_DATE, S_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
m.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1468) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    ... 65 more 
Caused by: java.sql.SQLException: Data truncated for column 'REPEAT_DAYS' at row 1 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 

編輯: 這是我WeekdayType枚舉

public enum WeekdayType { 
    MONDAY(Calendar.MONDAY), TUESDAY(Calendar.TUESDAY), WEDNESDAY(
    Calendar.WEDNESDAY), THURSDAY(Calendar.THURSDAY), FRIDAY(
    Calendar.FRIDAY), SATURDAY(Calendar.SATURDAY), SUNDAY(
    Calendar.SUNDAY); 

    private int day; 

    private WeekdayType(int day) { 
     this.day = day; 
    } 

    public int getDay() { 
     return day; 
    } 
} 
+0

向我們展示您的WeekdayType –

+0

列'REPEAT_DAYS'的數據類型是什麼數據類型 –

+0

枚舉類型....即,WeekdayType。 –

回答

13

貌似錯誤是由於一個事實,即列REPEAT_DAYS太小,以節省您通過WeekdayType枚舉傳遞值。因此,重新檢查您的下屬數據庫中該列的定義,並最終增加它的大小。

而且你錯過了一個註釋:

@Column(name="REPEAT_DAYS", length="45") 
@Enumerated(EnumType.STRING) 
private WeekdayType repeatDays; 

在註釋中length應該與你的數據庫架構的列的長度。

+0

實際上,當我創建數據庫的時候,我寫了Enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY')就像這樣。定義它的長度? –

+0

您是通過Hibernate創建數據庫模式嗎? – Atropo

+0

不..我爲Db使用Phpadmin並刪除了hbm2ddl.auto的屬性 –

1

假設你的表是由Hibernate自動生成,你不​​能標註枚舉類型像你這樣

@Column(name = 「REPEAT_DAYS」)

私人WeekdayType repeatDays;

檢查@Enumerated(EnumType.STRING)註釋

1

只有當你試圖插入值過長的列,以保存出現此問題。 就你而言,REPEAT_DAYS的列定義不足以保存你的價值。 還你,你不能標註枚舉類型就像

@Column(name="REPEAT_DAYS") 

private WeekdayType repeatDays; 

相反,你可以這樣做

@Enumerated(EnumType.STRING)和這樣定義

enum Fruits { 
    apple, 
    orange 
} 
8

這可以通過一個ENUM在引起你的枚舉你表格架構沒有你想要插入的所有值。喜歡的東西:

CREATE TABLE IF NOT EXISTS event (
    weekday_type ENUM(
     'SUNDAY', 
     'MONDAY', 
     'TUESDAY', 
     'WEDNESDAY', 
     'THURSDAY', 
     'FRIDAY' 
    ) NOT NULL 
); 

然後,當你使用JDBC執行像

INSERT INTO event (weekday_type) VALUES ('SATURDAY'); 

插入你得到這樣的異常:Data truncated for column 'weekday_type' at row 1因爲你忘了,包括你的表定義SATURDAY。當插入發生時,值爲truncated什麼也不是。