2012-12-19 1 views
13

In meiner Java-Programm ..Hibernate Bean Klasse eine Spalte wie ..Wie vermeidet man "Daten für Spalte abgeschnitten" in Mysql-Datenbank mit Java?

TimtableVO.java

@Column(name="REPEAT_DAYS") 
private WeekdayType repeatDays;//hear WeekdayType is Enum Class 

Und in meiner Dienstklasse definieren i als diese TimetableVO.java Bean-Klasse bin mit. . meine Service-Klasse

Dies ist:

public void createEvent(TimetableVO timetableVO) { 
    WeekdayType weekday = null; 
    for (String day : timetableVO.getTemp().split(",")) { 
     weekday = WeekdayType.valueOf(day); 
    } 
    timetableVO.setRepeatDays(weekday); 
    userDAO.createEvent(timetableVO); 
} 

Und meine DAO Klasse ich bin i nserting timetableVO Objekt ..

public void createEvent(TimetableVO timetableVO) throws DataAccessException { 
    entityManager.persist(timetableVO); 
} 

Aber Exception wird kommen ..

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: Das ist mein 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; 
    } 
} 
+0

zeigen Sie uns Ihre WeekdayType –

+0

Was ist Datentyp für Spalte "REPEAT_DAYS" –

+0

ein Enum-Typ .... dh, WeekdayType. –

Antwort

13

Sieht aus wie der Fehler aufgrund der Tatsache ist, dass die Spalte REPEAT_DAYS zu klein ist, um die Werte, die Sie vorbei sind über die WeekdayType Enum zu speichern. Überprüfe also die Definition dieser Spalte in deiner Unterling-Datenbank und erweitere schließlich ihre Größe.

Auch sind Sie nicht eine Anmerkung:

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

Die length in der Anmerkung sollte die Länge der Spalte in der DB-Schema entsprechen.

+0

Eigentlich, wenn jemals Datenbank in dieser Zeit erstellen, schrieb ich Enum ("MONTAG", "DIENSTAG", "Mittwoch", "Donnerstag", "FREITAG", "SAMSTAG", "SONNTAG") einfach nur so ... wie zu Definiere die Länge? –

+0

Erstellen Sie das DB-Schema über Hibernate? – Atropo

+0

NO .. Ich verwende Phpadmin für Db und entfernen Sie die Eigenschaft von hbm2ddl.auto –

1

Angenommen, Ihre Tabellen automatisch von Hibernate generiert werden, man kann Enum-Typ mit Anmerkungen versehen, wie Sie

tat

@Column (name = "REPEAT_DAYS")

privaten WeekdayType repeatDays;

prüfen @Enumerated(EnumType.STRING) Anmerkung

1

Dieses Problem tritt nur, wenn Sie die zu lang ist versuchen, einen Wert einzufügen für eine Spalte zu halten. In Ihrem Fall reicht die Spaltendefinition für REPEAT_DAYS nicht aus, um Ihren Wert zu halten. Auch Ihre Sie können kein Aufzählungstyp wie

@Column(name="REPEAT_DAYS") 

private WeekdayType repeatDays; 

Statt mit Anmerkungen versehen Sie so etwas wie

@Enumerated(EnumType.STRING) und definieren Sie Ihre ENUM-ähnliche

enum Fruits { 
    apple, 
    orange 
} 
8

Dies kann tun kann durch eine ENUM verursacht werden Ihre Tabellenschema, das nicht alle Werte enthält, die Sie einfügen möchten. Etwas wie:

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

Dann, wenn Sie einen Einsatz wie

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

JDBC ausführen verwenden Sie eine Ausnahme wie erhalten: Data truncated for column 'weekday_type' at row 1 weil Sie vergessen haben, SATURDAY in Ihrer Tabellendefinition enthalten. Wenn die Einfügung stattfindet, wird der Wert truncated zu nichts.

Verwandte Themen