`
Yokubee
  • 浏览: 1259 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

SQL Bigint Identity Columns with Hibernate Annotations

阅读更多
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;
...
}
分享到:
评论

相关推荐

    sqlserver-oracle 数据类型对照

    - `bigint`在SQL Server中对应Oracle的`NUMBER(19)`,用于存储大整数。 - `binary`和`varbinary`在SQL Server中分别对应Oracle的`RAW`类型,用于存储二进制数据。 - `bit`在SQL Server中没有直接对应的Oracle数据...

    SQL 字符串转换语句大全

    ### SQL字符串转换语句大全详解 #### 一、概述 在数据库操作中,字符串处理是一项常见且重要的功能。SQL提供了丰富的内置函数来帮助用户完成字符串的格式化与转换任务,这些函数可以极大地提高数据处理效率并简化...

    SQLServer中bigint转int带符号时报错问题解决方法

    在SQL Server中,当需要处理大量数据,特别是涉及到位运算的时候,可能会遇到数据类型转换的问题。在这种场景下,`bigint` 数据类型常被用来存储大整数,而`int` 则用于处理常规整数值。然而,从`bigint`转换到`int`...

    hibernate使用中与各种数据库字段类型对应类型训练

    8. **自增主键**:例如MySQL的AUTO_INCREMENT,Hibernate通常通过`@GeneratedValue`和`@Id`注解配合`GenerationType.IDENTITY`策略来处理。 9. **枚举类型**:在数据库中可以使用CHAR或INT存储,Hibernate通过`@...

    一个函数解决SQLServer中bigint 转 int带符号时报错问题

    在SQL Server中,大数据类型`bigint`用于存储非常大的整数值,而`int`类型则用于存储较小的整数。然而,在某些情况下,当我们需要将`bigint`转换为`int`时,可能会遇到算术溢出错误,尤其是在涉及到负数和位运算的...

    ORACLE与SQLSERVER对应关系

    在IT领域,数据库管理系统是核心组件之一,Oracle和SQL Server是两种广泛应用的关系型数据库系统。本文将探讨两者在存储过程方面的对应关系,并提供一些相关的学习资料。 首先,Oracle和SQL Server都支持存储过程,...

    完美解决SpringDataJPA报错create table hibernate_sequence (next_val bigint) type=MyISAM Hibernate: create t

    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的知识总结

    **Hibernate类型与MySQL数据类型的映射关系**:例如,Java的 `int`、`long`、`short`、`byte`、`float`、`double` 等基础类型分别对应MySQL的 `INTEGER`、`BIGINT`、`SMALLINT`、`TINYINT`、`FLOAT`、`DOUBLE` 等...

    阿里云odpsSql手册1

    阿里云odpsSql手册1摘要 大数据计算服务MaxCompute SQL概要介绍_MAXCompute SQL是一种面向海量数据(TB级别)的计算服务,适用于实时性要求不高的场合。 MaxCompute SQL的每个作业的准备、提交等阶段需要花费较长...

    Bigint大整数类

    为了解决这个问题,程序员通常会使用专门的大整数类(如本例中的"Bigint")。Bigint大整数类是一种自定义的数据结构,用于存储和操作超出常规整型范围的数值。 `BigInt` 类的设计目标是提供与常规整数相似的接口,...

    ip地址段转换bigint函数

    该函数是将传进的ip地址转换成bigint类型的sql函数 如:12.3.1.33 -> 201523489

    Hibernate-add学习

    - **dialect**: 指定了Hibernate使用的方言,它告诉Hibernate如何处理特定数据库的SQL语法差异。 - **MySQL**: `org.hibernate.dialect.MySQLDialect` - **Oracle**: `org.hibernate.dialect.Oracle9Dialect` - *...

    SQL常用函数总结

    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条记录 在...

    Hibernate数据类型映射及ID

    2. **Long**: 映射到`java.lang.Long`,在SQL中对应`BIGINT`类型,占用8字节。 3. **Short**: 映射到`java.lang.Short`,在SQL中对应`SMALLINT`类型,占用2字节。 4. **Byte**: 映射到`java.lang.Byte`,在SQL中对应...

    Hibernate和java中的对应数据类型

    - `long` 和 `java.lang.Long` 对应于 SQL 的 `BIGINT` - `float` 和 `java.lang.Float` 对应于 SQL 的 `FLOAT` - `double` 和 `java.lang.Double` 对应于 SQL 的 `DOUBLE` 2. **精确数值类型**: - `java.math...

    美国硅谷SVSE软件工程教育Hibernate-Lesson2

    例如,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中数据类型

    Hibernate 提供了多种数据类型,用于匹配不同数据库系统支持的标准 SQL 数据类型。这些数据类型包括: - **数值类型**:例如,`byte` 和 `java.lang.Byte` 映射到 `TINYINT`,`short` 和 `java.lang.Short` 映射到 ...

    C++ 数据结构 BigInt 大数

    在编程领域,大数(BigInt)是指能够处理超过标准整型数据类型范围的数值。在C++中,标准库并没有内置大数支持,因此需要自定义数据结构来实现这种功能。"BigInt"类通常用于存储和操作任意长度的整数,这对于计算、...

    DmDialect-for-hibernate5.6

    1. **数据类型映射**:DM数据库有自己的数据类型,如CHAR、VARCHAR、BIGINT等,DmDialect会将这些数据类型与Hibernate的Java类型进行映射,确保对象持久化时数据类型的正确转换。 2. **SQL生成**:DmDialect会根据...

Global site tag (gtag.js) - Google Analytics