Подтвердить что ты не робот

Как избежать "данных, укороченных для столбца" в базе данных Mysql с помощью java?

В моей 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)

EDIT: Это мой запрос 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;
    }
}
4b9b3361

Ответ 1

Похоже, что ошибка связана с тем, что столбец REPEAT_DAYS слишком мал, чтобы сохранить значения, которые вы передаете с помощью WeekdayType Enum. Поэтому перепроверьте определение этого столбца в вашей базе данных underling и в конечном итоге увеличьте его размер.

Также вам не хватает аннотации:

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

length в аннотации должен соответствовать длине столбца в вашей схеме БД.

Ответ 2

Это может быть вызвано 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 ни к чему.

Ответ 4

Предполагая, что ваши таблицы автоматически сгенерированы спящим режимом, вы не можете аннотировать тип Enum, как вы делали

@Column (name= "REPEAT_DAYS" )

private WeekdayType repeatDays;

Отметьте @Enumerated(EnumType.STRING) аннотацию

Ответ 5

Эта проблема возникает только тогда, когда вы пытаетесь вставить значение, которое слишком велико для хранения столбца. В вашем случае определение столбца для REPEAT_DAYS недостаточно для хранения вашего значения. Также вы не можете аннотировать тип перечисления типа

@Column(name="REPEAT_DAYS")

private WeekdayType repeatDays;

Вместо этого вы можете сделать что-то вроде

@Enumerated(EnumType.STRING) и определите свое перечисление как это

enum Fruits {
  apple,
  orange
}