java.sql.SQLException:列';性别';在枚举的第1行

java.sql.SQLException:列';性别';在枚举的第1行,java,hibernate,enums,annotations,Java,Hibernate,Enums,Annotations,我正在使用注释将记录持久化到MySQL数据库中 在数据库端,我将列gender定义为gender ENUM('M','F') 按如下方式定义枚举: public enum Gender { M,F; } @Column(name="gender") @Enumerated(EnumType.ORDINAL) private Enum<Gender> gender=Gender.M; employee.setGender(Gender.M); 在annotation类中,我定义

我正在使用注释将记录持久化到MySQL数据库中

在数据库端,我将列gender定义为gender ENUM('M','F')

按如下方式定义枚举:

public enum Gender {
M,F;
}
@Column(name="gender")
@Enumerated(EnumType.ORDINAL) 
private Enum<Gender> gender=Gender.M;
employee.setGender(Gender.M);
在annotation类中,我定义enum属性如下:

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
我尝试使用字符串和序数,但错误仍然存在

序号表示int。我是否需要将性别类型的架构定义从enum更改为String或int。 hibernate批注是否不适用于列类型枚举? 请帮助我解决这个问题。

什么
Enum
Gender
已经是一个
Enum
,并且这种类型的声明不是您想要的。
尝试更简单的方法:

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

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

问题来自Java和Mysql(UTF-16和UTF-8)之间字符编码的不同。将一个字符的
字符串
替换为
字符
为我解决了这个问题


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

Enum用于指定要使用哪个Enum进行持久化。我尝试了您建议的方法,但收到了指定Enum类型的警告。而且错误不会消失。但是谢谢你的建议Luca.Gender是一个枚举,所以你不需要指定,但除此之外,在MySQL中-如果我没有错的话-枚举被视为字符串而不是数字,所以序数应该是错误的。我认为最好改为byte/int标准SQL类型,而不是ENUM privative。IMHO最好的选择是改为numeric SQL数据类型,以避免RDMBSI隐式完成任何不需要的转换。意思是:不要使用MYSQL ENUM自定义类型,而是为性别字段使用标准int/byte类型我写了一个关于ENUM声明的问题,因为看到它很奇怪。如果你想让浏览器显示你的答案?我遇到了相同的错误,除了将该变量的数据类型改为String而不是enum之外,找不到解决方案