![](/img/trans.png)
[英]java.sql.SQLException: Data truncated for column 'MonthlyIncome' at row 1 error
[英]java.sql.SQLException: Data truncated for column 'gender' at row 1 for enum
我正在使用注释将记录保留在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。 休眠注释不适用于列类型枚举吗? 请帮助我解决这个问题。
什么Enum<Gender>
? Gender
已经是Enum
,这种声明不是您想要的。
尝试更简单:
@Column(name="gender")
@Enumerated(EnumType.ORDINAL)
private Gender gender=Gender.M;
我最近遇到了完全相同的问题,其中性别是数据库中两个字符的enum
。
问题出在Java和Mysql(UTF-16和UTF-8)之间字符编码不同。 放置恰好一个字符的String
而不是char
为我解决问题。
由于它不适合您,因此您可能还想将jdbcCompliantTruncation=false
添加到您的连接URL中(例如: jdbc:mysql://yourserver:3306/yourdatabase?jdbcCompliantTruncation=false
)。 在此警告下,它应阻止驱动程序生成异常。 它对我个人没有帮助,但是可能值得尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.