java.sql.SQLException:列的数据被截断

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16238852/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 05:56:54  来源:igfitidea点击:

java.sql.SQLException: Data truncated for column

javamysqlhibernateenums

提问by user2324182

I'm new in Java programming. I have an enum data type in my class:

我是 Java 编程的新手。我的班级中有一个枚举数据类型:

public class Persons {
    private String name;
    private String family;
    private Date birthDate;
    public enum degree {Bsd, Msd, prof};
    private degree degree;
    ...
}

In my MySQL database, I have a field for degree as: ENUM('Bsd','Mds','prof')and my hibernate mapping is like this:

在我的 MySQL 数据库中,我有一个学位字段:ENUM('Bsd','Mds','prof')我的休眠映射是这样的:

<class name="Entity.Professor" table="tbl_professor">
     <id column="ProfessorId" name="ProfessorId"/>
     <property column="name" name="name"/>
     <property column="family" name="family"/>
     <property column="birthDate" name="birthDate"/>
     <property column="degree" name="degree"/>
</class>

When I want to insert a new record in my table, I get this error:

当我想在我的表中插入一条新记录时,出现此错误:

Hibernate: insert into tbl_professor (name, family, birthDate, degree, ProfessorId) values (?, ?, ?, ?, ?)
Apr 26, 2013 6:15:24 PM org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1265, SQLState: 01000
Apr 26, 2013 6:15:24 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Data truncated for column 'degree' at row 1
Apr 26, 2013 6:15:24 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at DAO.ProfessorDAO.createProfessor(ProfessorDAO.java:21)
    at Entity.Test.main(Test.java:39)
Caused by: java.sql.BatchUpdateException: Data truncated for column 'degree' at row 1
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2028)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    ... 9 more
Caused by: java.sql.SQLException: Data truncated for column 'degree' at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1980)
    ... 12 more

Exception in thread "main" org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)

Can anyone help me? I'm really confused with enumdatatype.

谁能帮我?我真的对enum数据类型感到困惑。

回答by Erich

Well you're getting a Data truncation error, so I would check to see the allowed length of your MySQL column. Generally you'll see this error if the data in that field is either larger than your Hibernate/JPA mapping, or the length of the allowed db column.

好吧,您收到了数据截断错误,因此我会检查您的 MySQL 列的允许长度。通常,如果该字段中的数据大于您的 Hibernate/JPA 映射或允许的 db 列的长度,您将看到此错误。

回答by Buhake Sindi

Data truncation is when you add records that are longer than the maximum column size of the database column (in your case degree).

数据截断是指您添加的记录长于数据库列的最大列大小(在您的情况下degree)。

Since your MySQL ENUM for DEGREE column is of 3 types, you can annotation your enum with @Enumeratedas follows:

由于用于 DEGREE 列的 MySQL ENUM 有 3 种类型,因此您可以使用@Enumerated如下注释您的枚举:

@Enumerated(EnumType.STRING)
private degree degree;

回答by Lavanya

You need to map enums differently in hibernate, Hibernate provides org.hibernate.type.EnumType to map Enumerated types

你需要在 hibernate 中以不同的方式映射枚举,Hibernate 提供了 org.hibernate.type.EnumType 来映射枚举类型

   <property name="degree">
      <type name="org.hibernate.type.EnumType">
         <param name="enumClass">pkg.degree</param>
      </type>
   </property>

If you want the string to be stored instead of index 1,2 etc, you need to use 12

如果要存储字符串而不是索引 1,2 等,则需要使用 12

12 - java.sql.Types.VARCHAR

12 - java.sql.Types.VARCHAR

see the link Hibernate map enum to varchar

查看链接 Hibernate map enum to varchar

回答by keiki

One solution would be not to use enum type of mysql. An alternative is plain String or even better an extra table with an id as relation.

一种解决方案是不使用枚举类型的 mysql。另一种选择是纯字符串,或者更好的是一个带有 id 作为关系的额外表。

It has several disadvantages. The major one being maintaining it. You can't easily change the order or remove something in there

它有几个缺点。主要是维护它。您无法轻松更改订单或删除其中的某些内容

If you google for mysql this page is 3rd for a reason: http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

如果你用谷歌搜索 mysql 这个页面是第三个原因:http: //komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/