在单个事务中在Hibernate中分配密钥和插入

在单个事务中在Hibernate中分配密钥和插入,hibernate,spring,transactions,Hibernate,Spring,Transactions,我正在使用带有Hibernate(和SQL Server数据库)的Spring。对于我的一个实体,我需要生成一个PK,它是一个数字和字符串的组合 我正在为我的实体使用“assigned”键,因为这种PK(数字和字符串的组合,即ABC 1001)不能通过普通序列/标识生成 我想要的是 通过DB标识生成PK,并将标识值增加1(用于下一代PK) 将结果(即上一步返回的数字)与适当的字符串(即ABC)结合起来,使其成为我的实体的PK,例如ABC1001 将此密钥分配给我的实体,并通过调用session.

我正在使用带有Hibernate(和SQL Server数据库)的Spring。对于我的一个实体,我需要生成一个PK,它是一个数字和字符串的组合

我正在为我的实体使用“
assigned
”键,因为这种PK(数字和字符串的组合,即ABC 1001)不能通过普通序列/标识生成

我想要的是

  • 通过DB标识生成PK,并将标识值增加1(用于下一代PK)
  • 将结果(即上一步返回的数字)与适当的字符串(即ABC)结合起来,使其成为我的实体的PK,例如ABC1001
  • 将此密钥分配给我的实体,并通过调用session.save()
  • 如果任何操作失败,则回滚事务,即回滚实体插入并回滚对标识所做的任何更改

    我想到的一种方法是:创建一个存储过程,可以执行前两个步骤(生成PK、增量标识、将数字与字符串组合),然后将密钥分配给Entity并调用session.save()

    我的问题是,我必须使用HibernateCallBack来执行我的过程,在这里我必须处理JDBC连接。方法完成后,我必须关闭JDBC连接,然后在下一步中,我可以继续保存实体
    (session.save()

    我没有找到在单个事务中执行这两件事的方法[即调用过程和调用session.save()]。我正在使用Spring提供的声明性事务

    有没有一种方法可以在一个事务中执行这两件事,这样,如果实体插入失败,我甚至可以回滚对标识所做的更改


    或者您有什么更好的策略可以建议吗?

    为什么不跳过SP,从Java开始做所有事情?为“序列”创建一个一栏一记录表,创建一个服务,该服务将查询并增加其值,与字符串连接,将其设置为实体并进行所需的更改,所有这些都在一个@Transactional方法中实现。[编辑的打字]我认为不仅连接的PK必须是唯一的,而且还应该保持计数器的连续性?(比如,使用ABC001、DEF002、ABC003是不合适的)-因为如果不是这样,我建议为您的计数器设置一个标识字段,为您的ABC字符串设置一个任意字段,并设置一个包含这两个字段的唯一约束。是的。。这肯定是一个解决办法。