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
java.sql.SQLException: Data truncated for column
提问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 enum
datatype.
谁能帮我?我真的对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 @Enumerated
as follows:
由于用于 DEGREE 列的 MySQL ENUM 有 3 种类型,因此您可以使用@Enumerated
如下注释您的枚举:
@Enumerated(EnumType.STRING)
private degree degree;
- More info on
EnumType
.
- 更多信息
EnumType
。
回答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
回答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/