java.sql.SQLException:对于枚举,第1行的“gender”列的数据被截断

时间:2014-08-04 07:02:25

标签: java hibernate enums annotations

我正在使用注释来保存MySQL数据库中的记录。

在数据库方面,我将列性别定义为性别ENUM(' M',' F')

如下定义枚举:

public enum Gender {
M,F;
}

在注释类中,我按如下方式定义枚举属性:

@Column(name="gender")
@Enumerated(EnumType.ORDINAL) 
private Enum<Gender> gender=Gender.M;

我将数据保存在数据库中,如下所示:

employee.setGender(Gender.M);

但是当我运行程序时出现以下错误:

Hibernate: insert into Employees (birth_date, first_name,gender,hire_date,last_nane values
org.hibernate.exception.GenericJDBCException: Data truncated for column 'gender' at row 1
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert         
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation    
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke
at com.sun.proxy.$Proxy11.executeUpdate(Unknown Source)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract   
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert
at org.hibernate.persister.entity.AbstractEntityPersister.insert
at org.hibernate.persister.entity.AbstractEntityPersister.insert  
at org.hibernate.action.internal.EntityIdentityInsertAction.execute
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)

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.executeUpdate(PreparedStatement.java:2345)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation
... 25 more

我尝试使用String和序号,但错误仍然存​​在。

Ordinal表示int。我需要将性别类型的模式定义从枚举更改为String或int。 hibernate注释不适用于列类型枚举吗? 请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

Enum<Gender>是什么? Gender已经是Enum,这种声明并不是您想要的 尝试更轻松:

@Column(name="gender")
@Enumerated(EnumType.ORDINAL) 
private Gender gender=Gender.M;

答案 1 :(得分:0)

我最近遇到了完全相同的问题,其中性别是我数据库中两个字符的enum

问题来自Java和Mysql(UTF-16和UTF-8)之间不同的字符编码。放置String正好一个字符而不是char为我解决了这个问题。

由于它不适合您,您还可能希望将jdbcCompliantTruncation=false添加到您的连接网址(例如:jdbc:mysql://yourserver:3306/yourdatabase?jdbcCompliantTruncation=false)。它应该阻止驱动程序在此警告时生成异常。它对我个人没有帮助,但值得一试。