2012-12-19 46 views
13

在我的Java程序..Hibernate Bean类定义一个列如..如何在Mysql数据库中避免'数据被截断'使用java?

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类我是我nserting 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; 
    } 
} 
+0

向我们展示您的WeekdayType –

+0

列'REPEAT_DAYS'的数据类型是什么数据类型 –

+0

枚举类型....即,WeekdayType。 –

回答

13

貌似错误是由于一个事实,即列REPEAT_DAYS太小,以节省您通过WeekdayType枚举传递值。因此,重新检查您的下属数据库中该列的定义,并最终增加它的大小。

而且你错过了一个注释:

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

在注释中length应该与你的数据库架构的列的长度。

+0

实际上,当我创建数据库的时候,我写了Enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY')就像这样。定义它的长度? –

+0

您是通过Hibernate创建数据库模式吗? – Atropo

+0

不..我为Db使用Phpadmin并删除了hbm2ddl.auto的属性 –

1

假设你的表是由Hibernate自动生成,你不​​能标注枚举类型像你这样

@Column(name = “REPEAT_DAYS”)

私人WeekdayType repeatDays;

检查@Enumerated(EnumType.STRING)注释

1

只有当你试图插入值过长的列,以保存出现此问题。 就你而言,REPEAT_DAYS的列定义不足以保存你的价值。 还你,你不能标注枚举类型就像

@Column(name="REPEAT_DAYS") 

private WeekdayType repeatDays; 

相反,你可以这样做

@Enumerated(EnumType.STRING)和这样定义

enum Fruits { 
    apple, 
    orange 
} 
8

这可以通过一个ENUM在引起你的枚举你表格架构没有你想要插入的所有值。喜欢的东西:

CREATE TABLE IF NOT EXISTS event (
    weekday_type ENUM(
     'SUNDAY', 
     'MONDAY', 
     'TUESDAY', 
     'WEDNESDAY', 
     'THURSDAY', 
     'FRIDAY' 
    ) NOT NULL 
); 

然后,当你使用JDBC执行像

INSERT INTO event (weekday_type) VALUES ('SATURDAY'); 

插入你得到这样的异常:Data truncated for column 'weekday_type' at row 1因为你忘了,包括你的表定义SATURDAY。当插入发生时,值为truncated什么也不是。