2012-12-19 14 views
13

मेरी जावा प्रोग्राम ..Hibernate बीन कक्षा में एक स्तंभ को परिभाषित की तरह ..जावा का उपयोग कर MySQL डेटाबेस में 'कॉलम के लिए छोटा डेटा' से कैसे बचें?

TimtableVO.java

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

और मेरी सेवा कक्षा में मैं के रूप में इस TimetableVO.java सेम वर्ग का उपयोग कर रहा हूँ। ।

यह मेरी सेवा वर्ग है:

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

और मेरी डीएओ वर्ग मैं मैं कर रहा हूँ 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 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

हमें अपना सप्ताहांत टाइप –

+0

दिखाएं कॉलम 'REPEAT_DAYS' –

+0

एक एनम प्रकार .... यानी, सप्ताहांत टाइप के लिए डेटा प्रकार क्या है। –

उत्तर

13

लगता त्रुटि की तरह तथ्य यह है कि स्तंभ REPEAT_DAYS भी मान आप WeekdayType Enum के माध्यम से गुजर रहे हैं बचाने के लिए छोटा है कारण है। तो अपने अंडरलिंग डेटाबेस में उस कॉलम की परिभाषा को दोबारा जांचें और अंत में इसका आकार बढ़ाएं।

इसके अलावा, आप एक एनोटेशन छूट रहा है:

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

length एनोटेशन में अपने DB स्कीमा में अपने स्तंभ की लंबाई से मेल खाना चाहिए।

+0

असल में जब कभी उस समय डेटाबेस बनाते थे, मैंने एनम ('सोमवार', 'टुडेडे', 'वेडेनडे', 'गुरुवार', 'शुक्रवार', 'शनिवार', 'रविवार') लिखा था ... केवल इस तरह ... कैसे इसकी लंबाई परिभाषित करें? –

+0

क्या आप हाइबरनेट के माध्यम से डीबी स्कीमा बना रहे हैं? – Atropo

+0

नहीं .. मैं डीबी के लिए Phpadmin का उपयोग कर रहा हूँ और hbm2ddl.auto की संपत्ति को हटा रहा हूँ –

1

अपने टेबल मान लिया जाये कि हाइबरनेट द्वारा उत्पन्न ऑटो रहे हैं, आप Enum प्रकार व्याख्या की तरह तुमने किया था

@Column (नाम = "REPEAT_DAYS")

निजी WeekdayType repeatDays नहीं कर सकते;

चेक @Enumerated(EnumType.STRING) एनोटेशन

1

इस समस्या को केवल तब होता है जब आप एक मूल्य है जो बहुत लंबा एक स्तंभ धारण करने के लिए के लिए है सम्मिलित करने के लिए कोशिश कर रहे हैं। आपके मामले में, REPEAT_DAYS के लिए कॉलम परिभाषा आपके मूल्य को पकड़ने के लिए पर्याप्त नहीं है। इसके अलावा अपने आप की तरह

@Column(name="REPEAT_DAYS") 

private WeekdayType repeatDays; 

एक enum प्रकार व्याख्या नहीं कर सकते हैं इसके बजाय आप की तरह

@Enumerated(EnumType.STRING) कुछ करना है और इस

enum Fruits { 
    apple, 
    orange 
} 
8

इस में एक ENUM के कारण हो सकता है कि आपके enum परिभाषित कर सकते हैं अपने टेबल स्कीमा जिसमें आपके पास सम्मिलित करने वाले सभी मान नहीं हैं। कुछ की तरह: क्योंकि आप अपनी तालिका परिभाषा SATURDAY शामिल करना भूल Data truncated for column 'weekday_type' at row 1:

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 का उपयोग कर आप की तरह एक अपवाद मिलता है। जब सम्मिलित होता है, तो मान truncated कुछ भी नहीं मिलता है।