如何使用java避免Mysql数据库中的“数据被截断”?

时间:2012-12-19 10:44:37

标签: java mysql spring hibernate

在我的Java程序中.Hibernate Bean类定义了一个类,如..

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类我正在插入timetableVO对象..

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

但是Exception会来......

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 Enum

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

5 个答案:

答案 0 :(得分:15)

看起来错误是因为列REPEAT_DAYS太小而无法保存您通过WeekdayType枚举传递的值。因此,重新检查底层数据库中该列的定义,并最终增加它的大小。

你也错过了一个注释:

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

注释中的length应与数据库架构中列的长度匹配。

答案 1 :(得分:14)

这可能是由于您的表架构中的ENUM没有您尝试插入的所有值。类似的东西:

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

然后当你执行像

这样的插入时
INSERT INTO event (weekday_type) VALUES ('SATURDAY');

使用JDBC会出现类似:Data truncated for column 'weekday_type' at row 1的异常,因为您忘记在表定义中包含SATURDAY。插入发生时,值为truncated为空。

答案 2 :(得分:1)

您的服务器似乎在严格模式下运行,您可能会尝试在NOT NULL列中插入NULL。

另见:What is this error? "Database query failed: Data truncated for column 'column_name' at row 1

答案 3 :(得分:1)

假设你的表是由hibernate自动生成的,你不能像你那样注释Enum类型

  

@Column(名称=" REPEAT_DAYS&#34)

     

私人WeekdayType repeatDays;

检查@Enumerated(EnumType.STRING)注释

答案 4 :(得分:1)

仅当您尝试插入的值太长而无法保留列时,才会出现此问题。 在您的情况下,REPEAT_DAYS的列定义不足以保存您的值。 你也不能注释像

这样的枚举类型
@Column(name="REPEAT_DAYS")

private WeekdayType repeatDays;

相反,你可以做类似

的事情

@Enumerated(EnumType.STRING)并定义您的枚举

enum Fruits {
  apple,
  orange
}