22

私のJavaプログラムでは..Hibernate Beanクラスで、次のような1つの列を定義します..

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

5 に答える 5

18

エラーは、列REPEAT_DAYSが小さすぎてWeekdayType列挙型を介して渡す値を保存できないことが原因のようです。そのため、基になるデータベースでその列の定義を再確認し、最終的にそのサイズを増やしてください。

また、注釈がありません:

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

注釈のlengthは、DB スキーマの列の長さと一致する必要があります。

于 2012-12-19T10:51:45.263 に答える
1

この問題は、長すぎて列に保持できない値を挿入しようとした場合にのみ発生します。あなたの場合、の列定義REPEAT_DAYSは値を保持するのに十分ではありません。また、次のような列挙型に注釈を付けることはできません

@Column(name="REPEAT_DAYS")

private WeekdayType repeatDays;

代わりに、次のようなことができます

@Enumerated(EnumType.STRING)このように列挙型を定義します

enum Fruits {
  apple,
  orange
}
于 2012-12-19T10:57:08.283 に答える
1

サーバーが厳密モードで実行されているようで、NOT NULL 列に NULL を挿入しようとする可能性があります。

こちらもご覧ください:このエラーは何ですか? 「データベース クエリが失敗しました: 行 1 の列 'column_name' のデータが切り捨てられました

于 2012-12-19T10:49:13.443 に答える
1

テーブルが hibernate によって自動生成されると仮定すると、Enum 型に注釈を付けることはできません。

@Column(name="REPEAT_DAYS")

private WeekdayType repeatDays;

@Enumerated(EnumType.STRING)注釈をチェック

于 2012-12-19T10:52:12.860 に答える