Hibernate happily maps SQL bigint identity columns to java.math.BigInteger but then bombs when you try to generate values for this identity, claiming:
org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
The solution to this discrepancy is to define your own custom identity value generator. First, create a Java class that extends org.hibernate.id.IdentityGenerator. Two things happen in this class: you hijack the default delegate when Hibernate asks for it and you replace it with your own custom delegate. You then hijack the delegate’s behavior, and prevent it from invoking org.hibernate.id.IdentifierGeneratorFactory‘s static helper methods.
package com.domain.project.hibernate;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.dialect.Dialect;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.PostInsertIdentityPersister;
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
public class BigIntGenerator extends IdentityGenerator {
public static class BigIntDelegate extends GetGeneratedKeysDelegate {
public BigIntDelegate(PostInsertIdentityPersister arg0, Dialect arg1) {
super(arg0, arg1);
}
@Override
public Serializable executeAndExtract(PreparedStatement insert)
throws SQLException {
insert.executeUpdate();
ResultSet rs = null;
try {
rs = insert.getGeneratedKeys();
if (!rs.next()) {
throw new HibernateException( "The database returned no natively generated identity value" );
}
return rs.getBigDecimal(1).toBigIntegerExact();
// ...or whatever type your identity field is
} finally {
if (rs != null) rs.close();
}
}
}
@Override
public InsertGeneratedIdentifierDelegate getInsertGeneratedIdentifierDelegate(
PostInsertIdentityPersister persister, Dialect dialect,
boolean isGetGeneratedKeysEnabled) throws HibernateException {
InsertGeneratedIdentifierDelegate d =
super.getInsertGeneratedIdentifierDelegate(persister, dialect, isGetGeneratedKeysEnabled);
if(d instanceof GetGeneratedKeysDelegate) d = new BigIntDelegate(persister, dialect);
return d;
}
}Tell Hibernate to use your custom identity generator with the following annotation:
@GenericGenerator(
name="BigIntGenerator",
strategy="com.domain.project.hibernate.BigIntGenerator"
)
@Entity
@Table(name="Pages")
public class Page implements Cloneable, Serializable {
@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="BigIntGenerator")
@Column(name="PageID", nullable=false)
private BigInteger id;
...
}
分享到:
相关推荐
- `bigint`在SQL Server中对应Oracle的`NUMBER(19)`,用于存储大整数。 - `binary`和`varbinary`在SQL Server中分别对应Oracle的`RAW`类型,用于存储二进制数据。 - `bit`在SQL Server中没有直接对应的Oracle数据...
### SQL字符串转换语句大全详解 #### 一、概述 在数据库操作中,字符串处理是一项常见且重要的功能。SQL提供了丰富的内置函数来帮助用户完成字符串的格式化与转换任务,这些函数可以极大地提高数据处理效率并简化...
在SQL Server中,当需要处理大量数据,特别是涉及到位运算的时候,可能会遇到数据类型转换的问题。在这种场景下,`bigint` 数据类型常被用来存储大整数,而`int` 则用于处理常规整数值。然而,从`bigint`转换到`int`...
8. **自增主键**:例如MySQL的AUTO_INCREMENT,Hibernate通常通过`@GeneratedValue`和`@Id`注解配合`GenerationType.IDENTITY`策略来处理。 9. **枚举类型**:在数据库中可以使用CHAR或INT存储,Hibernate通过`@...
在SQL Server中,大数据类型`bigint`用于存储非常大的整数值,而`int`类型则用于存储较小的整数。然而,在某些情况下,当我们需要将`bigint`转换为`int`时,可能会遇到算术溢出错误,尤其是在涉及到负数和位运算的...
在IT领域,数据库管理系统是核心组件之一,Oracle和SQL Server是两种广泛应用的关系型数据库系统。本文将探讨两者在存储过程方面的对应关系,并提供一些相关的学习资料。 首先,Oracle和SQL Server都支持存储过程,...
2020-04-09 12:52:29.990 INFO 14120 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect Hibernate: create table hibernate_sequence ...
**Hibernate类型与MySQL数据类型的映射关系**:例如,Java的 `int`、`long`、`short`、`byte`、`float`、`double` 等基础类型分别对应MySQL的 `INTEGER`、`BIGINT`、`SMALLINT`、`TINYINT`、`FLOAT`、`DOUBLE` 等...
阿里云odpsSql手册1摘要 大数据计算服务MaxCompute SQL概要介绍_MAXCompute SQL是一种面向海量数据(TB级别)的计算服务,适用于实时性要求不高的场合。 MaxCompute SQL的每个作业的准备、提交等阶段需要花费较长...
为了解决这个问题,程序员通常会使用专门的大整数类(如本例中的"Bigint")。Bigint大整数类是一种自定义的数据结构,用于存储和操作超出常规整型范围的数值。 `BigInt` 类的设计目标是提供与常规整数相似的接口,...
该函数是将传进的ip地址转换成bigint类型的sql函数 如:12.3.1.33 -> 201523489
- **dialect**: 指定了Hibernate使用的方言,它告诉Hibernate如何处理特定数据库的SQL语法差异。 - **MySQL**: `org.hibernate.dialect.MySQLDialect` - **Oracle**: `org.hibernate.dialect.Oracle9Dialect` - *...
SERIALNO BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE), ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) ) ``` 取前n条记录 在...
2. **Long**: 映射到`java.lang.Long`,在SQL中对应`BIGINT`类型,占用8字节。 3. **Short**: 映射到`java.lang.Short`,在SQL中对应`SMALLINT`类型,占用2字节。 4. **Byte**: 映射到`java.lang.Byte`,在SQL中对应...
- `long` 和 `java.lang.Long` 对应于 SQL 的 `BIGINT` - `float` 和 `java.lang.Float` 对应于 SQL 的 `FLOAT` - `double` 和 `java.lang.Double` 对应于 SQL 的 `DOUBLE` 2. **精确数值类型**: - `java.math...
例如,Java的byte、Short、Integer、Long、Float、Double、BigDecimal、Char、Boolean、String分别对应于SQL的TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、NUMERIC、BIT、VARCHAR、DATE、TIME、BINARY、...
Hibernate 提供了多种数据类型,用于匹配不同数据库系统支持的标准 SQL 数据类型。这些数据类型包括: - **数值类型**:例如,`byte` 和 `java.lang.Byte` 映射到 `TINYINT`,`short` 和 `java.lang.Short` 映射到 ...
在编程领域,大数(BigInt)是指能够处理超过标准整型数据类型范围的数值。在C++中,标准库并没有内置大数支持,因此需要自定义数据结构来实现这种功能。"BigInt"类通常用于存储和操作任意长度的整数,这对于计算、...
1. **数据类型映射**:DM数据库有自己的数据类型,如CHAR、VARCHAR、BIGINT等,DmDialect会将这些数据类型与Hibernate的Java类型进行映射,确保对象持久化时数据类型的正确转换。 2. **SQL生成**:DmDialect会根据...