简体   繁体   English

在Enum字段(DB)中插入字符串值(java)获取“数据截断列”

[英]While inserting String value (java) in Enum field (DB) Getting “ Data truncated for column”

In my mysql table there is one enum field 'spe_gender'. 在我的mysql表中有一个枚举字段'spe_gender'。

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)

So I created one POJO class as: 所以我创建了一个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;
    }

    // ......

}

When I trying to write data into this table I am getting an exception 当我尝试将数据写入此表时,我得到一个例外

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

I think the issue is While inserting String value (through java) in Enum field (in DB). 我认为问题是在Enum字段(在DB中)插入String值(通过java)。 Here is my methods where I am getting Exception. 这是我的方法,我得到了例外。

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

Can't I insert this enum value in DB? 我不能在DB中插入此枚举值吗?

In your java code, declare spe_gender as an Enum type 在您的java代码中,将spe_gender声明为Enum类型

private Gender spe_gender

where Gender is an Enum class 性别是Enum类

public enum Gender {
    MALE,
    FEMALE
}

In order to answer that, you would have to give an example of the data actually being inserted. 为了回答这个问题,您必须提供实际插入数据的示例。

Anyway, regarding the exception that you get, you're most likely not inserting "male" or "female", since it says "Data truncated for column 'spe_gender' at row 1" it means that the data you're inserting differs, and is in fact bigger (as in more characters) than the allowed one. 无论如何,关于你获得的例外情况,你很可能不会插入“男性”或“女性”,因为它表示“第1行的列'spe_gender'数据被截断”意味着你插入的数据不同,并且实际上比允许的更大(如更多的字符)。

Also, check if there's an actual method to insert enums rather than "setString". 另外,检查是否存在插入枚举的实际方法而不是“setString”。 -> EDIT: it does not - >编辑:它没有

Thanks Mick Mnemonic for the suggestion. 感谢Mick Mnemonic提出的建议。 It worked. 有效。

replacing 更换

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

with

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

worked for me. 为我工作。 Thanks all. 谢谢大家。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM