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

2022-09-02 00:55:24

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

TimtableVO.java

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

在我的服务类中,我使用此时间表VO.java豆类作为..

这是我的服务类:

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类我正在插入时间表VO对象。

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)

编辑:这是我的工作日类型枚举

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

答案 1

这可能是由表中的架构引起的,该架构不具有您尝试插入的所有值。像这样: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 1SATURDAYtruncated


答案 2

看起来错误是由于列太小而无法保存通过枚举传递的值。因此,请在下属数据库中重新检查该列的定义,并最终增加其大小。REPEAT_DAYSWeekdayType

此外,您还缺少注释:

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

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


推荐