Hibernate - 如何为整数类型提供正确的映射?
Posted
技术标签:
【中文标题】Hibernate - 如何为整数类型提供正确的映射?【英文标题】:Hibernate - How to provide right mapping to integer type? 【发布时间】:2012-08-22 09:46:05 【问题描述】:我正在执行我的 maven 构建,它抛出了这个异常:
Last cause: Wrong column type in x.clients for column type. Found: tinyint, expected: integer
我是这样映射的:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
我正在使用 InnoDB 创建列,如下所示:id int NOT NULL UNIQUE AUTO_INCREMENT
这不应该吗?为什么说他在找tinyint?
【问题讨论】:
我认为这与 Wicket 无关,请您删除“wicket”标签吗? 让我展示你的客户实体。 【参考方案1】:将此添加到id
字段的注释中:
@Column(columnDefinition = "TINYINT")
【讨论】:
仍然给我同样的例外。【参考方案2】:@Column(columnDefinition = "int")
【讨论】:
仍然给我同样的例外。【参考方案3】:尝试添加类型注释:
@Type(type = "org.hibernate.type.IntegerType")
【讨论】:
【参考方案4】:使用@Basic 表示基本整数。不过,您总是可以尝试将您的 ID 声明为 Long。我通常总是使用 Long 作为我的 ID。见Mapping Identifier Properities:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
【讨论】:
好吧,将 id 设置为 Long 确实起到了作用。但由于某种原因,我不能在整数上使用 tinyint。嗯嗯。【参考方案5】:我刚遇到这个问题,分享详细信息应该很有用。我的情况是:
你定义@Column (... definition = "integer" ) Oracle 将“整数”翻译成小数(0,-127)(或者小数(0),我还不清楚) 您使用了一些其他应用程序,其中 'test.hibernate.hbm2ddl.auto' 是 'validate' Hibernate 报告整数 != 十进制并且验证失败我唯一的解决方案是将 test.hibernate.hbm2ddl.auto 保持为空(未定义 = 未触及数据库)。不确定是 Oracle 还是 Hibernate 错误(或两者兼有)。
【讨论】:
【参考方案6】:我知道这个问题(真的!)老了,但是:
TINYINT 表示 8 位值。它映射到字节/字节。在这两种情况下,它的最小值为 -128,最大值为 127(含)。
SMALLINT 表示 16 位值。它映射到短/短。
INTEGER 表示 32 位值。它映射到 int/Integer。
BIGINT 表示 64 位值。它映射到 long/Long。
因此,您不能使用 Integer 映射 tinyint;你必须使用字节。
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://dev.mysql.com/doc/refman/5.7/en/integer-types.html
【讨论】:
为什么建议使用 tinyint 映射到 Byte 而不是 Short?以上是关于Hibernate - 如何为整数类型提供正确的映射?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Camellia 密码提供正确的密钥并在 Java 中进行加密
spring/hibernate 如何为我们提供防止 SQL 注入的保证以及它是如何在内部处理的?
如何为这个 React Native Typescript 导航问题提供正确的参数