2017-02-06 2 views
1

In meiner Mysql-Tabelle gibt es ein Enum-Feld 'spe_gender'.Beim Einfügen von String-Wert (Java) in Enum-Feld (DB) Abrufen von "Daten für Spalte abgeschnitten"

mysql> desc tbl_sswltdata_persons; 
+-----------------+-----------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+-----------------+-----------------------+------+-----+---------+----------------+ 
| spe_id   | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 
| spe_sen_id  | bigint(20) unsigned | NO | MUL | NULL |    | 
| spe_gender  | enum('male','female') | YES |  | NULL |    | 
| spe_is_deceased | tinyint(1)   | NO |  | 0  |    | 
| spe_birth_place | varchar(255)   | YES |  | NULL |    | 
| spe_create_date | datetime    | YES |  | NULL |    | 
| spe_update_date | datetime    | YES |  | NULL |    | 
+-----------------+-----------------------+------+-----+---------+----------------+ 
7 rows in set (0.00 sec) 

Also habe ich eine POJO Klasse:

public class SswltdataPersons implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private long spe_id; 
    private long spe_sen_id; 
    private String spe_gender; 
    private String spe_is_deceased; 
    private String spe_birth_place; 
    private String spe_create_date; 
    private String spe_update_date; 

    // ......... 

    public String getSpe_gender() { 
     return spe_gender; 
    } 
    public void setSpe_gender(String spe_gender) { 
     this.spe_gender = spe_gender; 
    } 

    // ...... 

} 

Wenn ich versuche, Daten in diese Tabelle schreiben ich eine Ausnahme

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL 
    [INSERT INTO iwpro_imp.tbl_sswltdata_persons VALUES(?,?,?,?,?,?,?)]; 
    Data truncated for column 'spe_gender' at row 1; nested exception is java.sql.BatchUpdateException: Data truncated for column 'spe_gender' at row 1 

ich das Problem denke ich immer ist beim Einfügen String-Wert (über Java) im Enum-Feld (in DB). Hier sind meine Methoden, wo ich Exception bekomme.

@Transactional(value="transactionManager_iwpro_imp", rollbackFor = Exception.class) 
    public void saveAllPersons(final List<SswltdataPersons> list) { 


     String sql = "INSERT INTO iwpro_imp.tbl_sswltdata_persons VALUES(?,?,?,?,?,?,?)"; 

     try{ 
      jdbcTemplate.update("SET foreign_key_checks = 0"); 

      List<List<SswltdataPersons>> batchLists = Lists.partition(list, batchSize); 

      for(final List<SswltdataPersons> batch : batchLists) { 
       BatchPreparedStatementSetter bpss = new BatchPreparedStatementSetter() { 
        @Override 
        public void setValues(PreparedStatement ps, int index) throws SQLException { 
         SswltdataPersons dataObject = batch.get(index); 
         ps.setLong(1, dataObject.getSpe_id()); 
         ps.setLong(2, dataObject.getSpe_sen_id()); 
         ps.setString(3, dataObject.getSpe_gender()); 
         ps.setString(4, dataObject.getSpe_is_deceased()); 
         ps.setString(5, dataObject.getSpe_birth_place()); 
         ps.setString(6, dataObject.getSpe_create_date()); 
         ps.setString(7, dataObject.getSpe_update_date()); 
        } 

        @Override 
        public int getBatchSize() { 
         return batch.size(); 
        } 
       }; 
       jdbcTemplate.batchUpdate(sql, bpss); 
      } 

      jdbcTemplate.update("SET foreign_key_checks = 1"); 

     }catch(Exception e){ 
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
      logger.error("\n\nUnexpected Exception:\n", e); 
      e.printStackTrace(); 
     } 
    } 

Kann ich diesen Aufzählungswert nicht in DB einfügen?

+1

Sie sollten eine explizite Spaltenliste in der INSERT-Anweisung verwenden, um sicherzustellen, dass Ihre Variablen an die richtige Spalte gebunden werden. Welche Daten haben Sie in 'dataObject'? –

+0

Sie sollten zuerst überprüfen, dass Ihre Enum-Wert Java-Seite wirklich "männlich" oder "weiblich" ist, und Sie sollten Spaltennamen in der Einfügeabfrage angeben, um sicherzustellen, dass jeder Wert in der richtigen Spalte – BackSlash

+0

gespeichert wird Daten von einem Server zu einem anderen Server (beide Datenbanken sind identisch). Also DataObject enthält Daten von Server 1, die ich auf Server 2 schreiben werde. Auf Server 2 bekomme ich eine Ausnahme. – Shashank

Antwort

0

Dank Mick Mnemonic für den Vorschlag. Es funktionierte.

ps.setString(3, dataObject.getSpe_gender().isEmpty()); 

mit

ps.setString(3, dataObject.getSpe_gender().isEmpty() ? null : dataObject.getSpe_gender()); 

Ersatz für mich gearbeitet. Danke allen.

+2

Sollte der zu setzende Wert nicht 'null' anstatt' "" sein, wenn der enum-Wert leer ist? –

+0

yup. Antwort geändert. – Shashank

0

In Ihrem Java-Code, erklären spe_gender als Typ Enum

private Gender spe_gender 

wo Geschlecht eine ENUM-Klasse

public enum Gender { 
    MALE, 
    FEMALE 
} 
+0

Wenn ich es ändern, um Geschlecht zu schreiben, dann wie ich schreiben werde ps.setString (3, dataObject.getSpe_gender()); als setString akzeptiert nur (int, String) – Shashank

+0

in diesem Fall müssten Sie es in Zeichenfolge konvertieren, und in Ihrem Fall auch in Kleinbuchstaben, so wäre es etwa wie folgt: 'dataObject.getSpe_gender(). name.toLowerCase() ', oder fügen Sie einfach eine Methode zur Enumeration hinzu, die den Namen in Kleinbuchstaben zurückgibt. –

0

Um ist das zu beantworten, würden Sie ein Beispiel für die geben müssen Daten werden tatsächlich eingefügt.

Wie auch immer, in Bezug auf die Ausnahme, die Sie erhalten, werden Sie wahrscheinlich nicht "männlich" oder "weiblich" einfügen, da es "Daten abgeschnitten für Spalte 'spe_gender' in Zeile 1" bedeutet, dass die Daten Sie ' Das Einfügen ist anders und ist tatsächlich größer (wie in mehr Zeichen) als das erlaubte.

Überprüfen Sie auch, ob es tatsächlich eine Methode zum Einfügen von Enums und nicht von "setString" gibt. -> EDIT: es ist nicht

+0

Ich habe die Daten ausgedruckt und denke, dass ich die richtigen Werte einfüge. Siehe hier das SOP-Ergebnis: System.out.println (dataObject.getSpe_gender() + ":::" + dataObject.getSpe_gender(). Length()); gibt mir weiblich ::: 6 männlich ::: 4 ::: 0 – Shashank

+0

Wie ich in den Kommentaren sagte, fügen Sie eine leere Zeichenfolge, versuchen Sie @ Mick-mnemonischer Vorschlag, sollte funktionieren –

+0

ersetzt ps.setString (3, dataObject.getSpe_gender(). isEmpty()); mit ps.setString (3, dataObject.getSpe_gender(). IsEmpty()? "": DataObject.getSpe_gender()); arbeitete für mich. – Shashank

Verwandte Themen