【问题标题】:java.sql.SQLException: Data truncated for column 'gender' at row 1 for enumjava.sql.SQLException:枚举的第 1 行列“性别”的数据被截断
【发布时间】:2014-08-04 07:02:25
【问题描述】:

我正在使用注释将记录保存在 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

我尝试了字符串和序数,但错误仍然存​​在。

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

【问题讨论】:

  • 我写了一个关于你的枚举声明的问题,因为看到它很奇怪。如果您想将浏览器指向stackoverflow.com/questions/25114306/…
  • 你得到答案了吗?我遇到了同样的错误,除了将该变量的数据类型更改为字符串而不是枚举之外找不到解决方案

标签: java hibernate enums annotations


【解决方案1】:

什么Enum&lt;Gender&gt;Gender 已经是 Enum 并且这种类型的声明不是您想要的。
试试更简单的:

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

【讨论】:

  • Enum 是指定使用哪个枚举来持久化。
  • 我尝试了你的建议,但我收到了指定枚举类型的警告。错误也不会消失。但感谢卢卡的建议。
  • 性别是一个枚举,所以你不需要指定,但除此之外,在 MySQL 中——如果我没记错的话——枚举被视为字符串而不是数字,所以 ORDINAL 应该是错误的。我认为最好转向 byte/int 标准 SQL 类型,而不是 ENUM 专有。
  • 恕我直言,最好的选择是移动到数字 SQL 数据类型,以避免 RDMBS 隐式完成任何不需要的转换
  • 我的意思是:不要使用 MYSQL ENUM 自定义类型,而是使用标准的 int/byte 类型作为性别字段
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2015-02-19
    • 2013-04-20
    • 2014-01-09
    • 2021-03-14
    • 1970-01-01
    • 2019-08-08
    • 2013-12-24
    • 2019-11-18
    相关资源
    最近更新 更多