web-dev-qa-db-ja.com

javaを使用してMysqlデータベースで「列のデータが切り捨てられる」を回避するにはどうすればよいですか?

My Java Program ..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列挙です

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;
    }
}
18
Java Developer

エラーの原因は、列REPEAT_DAYSは小さすぎて、WeekdayType Enumを介して渡している値を保存できません。そのため、基になるデータベースでその列の定義を再確認し、最終的にサイズを増やします。

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

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

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

15
Atropo

これは、挿入しようとしているすべての値を持たないテーブルスキーマの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を何も取得しません。

15

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

_@Column(name="REPEAT_DAYS")

private WeekdayType repeatDays;
_

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

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

_enum Fruits {
  Apple,
  orange
}
_
1
Sajan Chandran

サーバーはストリクトモードで実行されているようで、NOT NULL列にNULLを挿入しようとする場合があります。

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

1
michael667

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

@Column(name = "REPEAT_DAYS")

プライベートWeekdayType repeatDays;

@Enumerated(EnumType.STRING)注釈を確認してください

1
ssk