在单个事务中在Hibernate中分配密钥和插入
我正在使用带有Hibernate(和SQL Server数据库)的Spring。对于我的一个实体,我需要生成一个PK,它是一个数字和字符串的组合 我正在为我的实体使用“在单个事务中在Hibernate中分配密钥和插入,hibernate,spring,transactions,Hibernate,Spring,Transactions,我正在使用带有Hibernate(和SQL Server数据库)的Spring。对于我的一个实体,我需要生成一个PK,它是一个数字和字符串的组合 我正在为我的实体使用“assigned”键,因为这种PK(数字和字符串的组合,即ABC 1001)不能通过普通序列/标识生成 我想要的是 通过DB标识生成PK,并将标识值增加1(用于下一代PK) 将结果(即上一步返回的数字)与适当的字符串(即ABC)结合起来,使其成为我的实体的PK,例如ABC1001 将此密钥分配给我的实体,并通过调用session.
assigned
”键,因为这种PK(数字和字符串的组合,即ABC 1001)不能通过普通序列/标识生成
我想要的是
(session.save()
)
我没有找到在单个事务中执行这两件事的方法[即调用过程和调用session.save()]。我正在使用Spring提供的声明性事务
有没有一种方法可以在一个事务中执行这两件事,这样,如果实体插入失败,我甚至可以回滚对标识所做的更改
或者您有什么更好的策略可以建议吗?为什么不跳过SP,从Java开始做所有事情?为“序列”创建一个一栏一记录表,创建一个服务,该服务将查询并增加其值,与字符串连接,将其设置为实体并进行所需的更改,所有这些都在一个@Transactional方法中实现。[编辑的打字]我认为不仅连接的PK必须是唯一的,而且还应该保持计数器的连续性?(比如,使用ABC001、DEF002、ABC003是不合适的)-因为如果不是这样,我建议为您的计数器设置一个标识字段,为您的ABC字符串设置一个任意字段,并设置一个包含这两个字段的唯一约束。是的。。这肯定是一个解决办法。