【问题标题】:JPA BigInteger is beeing mapped to decimal for MySQL?JPA BigInteger 被映射到 MySQL 的十进制?
【发布时间】:2017-07-30 05:53:46
【问题描述】:

我有一个带有 id 属性的简单类,我希望将其创建为 bigint。

这里是属性

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@NotNull
public java.math.BigInteger id;

但是这会生成:

id decimal(19,2) not null auto_increment

我当然可以加

@Column(columnDefinition = "bigint(20)")

然后它可以工作,但我无法理解为什么剂量 JPA 更喜欢匹配十进制而不是 bigint。

生成的映射也会导致无效 id 的错误,因为小数点不是 auto_incrementable。

我正在使用具有 spring-boot-starter-data-jpa 依赖关系的 spring boot。 配置如下:

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

有什么想法吗?

【问题讨论】:

  • AUTO_INCREMENT 仅适用于整数和浮点类型。请参阅 MySQL 手册,创建表。 AUTO_INCREMENT 不适用于 DECIMAL
  • 是的,我知道这一点。问题更多是关于为什么 jpa 映射 BigInteger 类型的小数?

标签: java mysql jpa spring-boot


【解决方案1】:

JDBC 类型 BIGINT 表示介于 -9223372036854775808 和 9223372036854775807 之间的 64 位有符号整数值。 对应的 SQL 类型 BIGINT 是 SQL 的非标准扩展。实际上,SQL BIGINT 类型目前还没有被任何主要数据库实现,我们建议在可移植代码中避免使用它。

BIGINT 类型的推荐 Java 映射为 Java long

【讨论】:

  • “实际上,SQL BIGINT 类型目前还没有被任何主要数据库实现,我们建议在可移植代码中避免使用它。”真的吗?哪个主流数据库不支持BIGINT
  • 很可能是因为 BIGINT 可以是无符号的(至少在 MySQL 中,如果在其他 RDBMS 中没有的话)。唯一可以容纳全部 64 位无符号整数范围的 Java 类型是 BigInteger。对此使用 long 是不正确的,因为这会将 18446744073709551615 (264 - 1) 转换为 -1。
  • 好的。我尝试将 BigInteger 更改为 Long 并在 MySQL 中转换为 bigint(20)。总而言之,BigInteger 有点大,所以它被映射到小数,因为这是可以支持 java 类型的数据类型。至少这是我的理解。
猜你喜欢
  • 2011-06-26
  • 2012-10-19
  • 2012-12-12
  • 2020-10-27
  • 2011-03-10
  • 2021-02-16
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多