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;
}
}
エラーの原因は、列REPEAT_DAYS
は小さすぎて、WeekdayType
Enumを介して渡している値を保存できません。そのため、基になるデータベースでその列の定義を再確認し、最終的にサイズを増やします。
また、注釈がありません:
@Column(name="REPEAT_DAYS", length="45")
@Enumerated(EnumType.STRING)
private WeekdayType repeatDays;
注釈のlength
は、DBスキーマの列の長さと一致する必要があります。
これは、挿入しようとしているすべての値を持たないテーブルスキーマの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
を何も取得しません。
この問題は、列を保持するには長すぎる値を挿入しようとした場合にのみ発生します。あなたの場合、_REPEAT_DAYS
_の列定義は値を保持するのに十分ではありません。また、次のような列挙型に注釈を付けることはできません
_@Column(name="REPEAT_DAYS")
private WeekdayType repeatDays;
_
代わりに、次のようなことができます
@Enumerated(EnumType.STRING)
そして、次のように列挙型を定義します
_enum Fruits {
Apple,
orange
}
_
サーバーはストリクトモードで実行されているようで、NOT NULL列にNULLを挿入しようとする場合があります。
こちらもご覧ください: このエラーは何ですか? 「データベースクエリが失敗しました:行1の列 'column_name'のデータが切り捨てられました
テーブルがhibernateによって自動生成されると仮定すると、Enumタイプに注釈を付けることはできません。
@Column(name = "REPEAT_DAYS")
プライベートWeekdayType repeatDays;
@Enumerated(EnumType.STRING)
注釈を確認してください