2017-02-06 2 views
1

В моей таблице mysql есть одно поле enum 'spe_gender'.Вставка значения String (java) в поле Enum (DB) Получение «Данные, усеченные для столбца»

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) 

Так что я создал один класс POJO как:

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; 
    } 

    // ...... 

} 

Когда я пытаюсь записать данные в эту таблицу я получаю исключение

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 

Я думаю, что проблема При вставке Значение строки (через java) в поле Enum (в DB). Вот мои методы, когда я получаю исключение.

@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(); 
     } 
    } 

Не могу ли вставить это значение перечисления в БД?

+1

Вы должны использовать явный список столбцов в инструкции 'INSERT', чтобы убедиться, что ваши переменные привязаны к правильному столбцу. Какие данные у вас есть в 'dataObject'? –

+0

Вы должны сначала проверить, что ваше значение enum value java-side действительно является «мужчиной» или «женским», и вы должны указать имена столбцов в запросе вставки, чтобы убедиться, что каждое значение будет сохранено в правильном столбце – BackSlash

+0

Фактически я копирую данные с одного сервера на другой сервер (обе базы данных идентичны). поэтому dataObject содержит данные с сервера 1, которые я собираюсь записать на сервере 2. на сервере 2 я получаю исключение. – Shashank

ответ

0

Спасибо Mick Мнемоника за предложение. Это сработало.

замена

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

с

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

работал для меня. Спасибо всем.

+2

Не должно ли значение быть 'null' вместо' '' ', когда значение перечисления пусто? –

+0

yup. ответ модифицировано. – Shashank

0

В коде Java, объявить spe_gender как тип Enum

private Gender spe_gender 

где Гендер класс Enum

public enum Gender { 
    MALE, 
    FEMALE 
} 
+0

Если я изменил его на тип Пол, тогда как я напишу ps.setString (3, dataObject.getSpe_gender()); поскольку setString принимает только (int, String) – Shashank

+0

, в этом случае вам придется преобразовать его в строку, а в вашем случае - в нижний регистр, так что это будет что-то вроде: 'dataObject.getSpe_gender(). name.toLowerCase() 'или просто добавить метод к перечислению, который возвращает имя в нижнем регистре –

0

Для того, чтобы ответить на этот вопрос, вы должны дать пример из данные фактически вставлены.

В любом случае, в отношении исключения, которое вы получаете, вы, скорее всего, не вставляете «мужчина» или «женщина», так как в нем говорится: «Данные усечены для столбца« spe_gender »в строке 1», это означает, что данные, re inserting отличается, и на самом деле больше (как и в большем количестве символов), чем разрешенный.

Кроме того, проверьте, существует ли реальный способ вставки перечислений, а не «setString». -> EDIT: это не

+0

Я распечатал данные, и я думаю, что вставляю правильные значения. См. Здесь результат SOP: System.out.println (dataObject.getSpe_gender() + ":::" + dataObject.getSpe_gender(). Length()); дает мне женщину ::: 6 male ::: 4 ::: 0 – Shashank

+0

Как я уже сказал в комментариях, вы вставляете пустую строку, попробуйте @ mick-mnemonic предложение, должны работать –

+0

вместо ps.setString (3, . dataObject.getSpe_gender() IsEmpty()); с ps.setString (3, dataObject.getSpe_gender(). IsEmpty()? "": DataObject.getSpe_gender()); работал для меня. – Shashank

Смежные вопросы