Hibernate 在ConstraintViolationException上重试@GenericGenerator

Hibernate 在ConstraintViolationException上重试@GenericGenerator,hibernate,spring-data,Hibernate,Spring Data,我正在使用@GenericGenerator处理复合主键创建。在并发调用的情况下,它有时会因ConstraintViolationException而失败。我更愿意设置一个重试机制,而不是让一些并发POST调用失败。问题是我无法强制重新生成密钥 我曾尝试在失败时使用同一对象再次调用JpaRepositorysaveAndFlush,但@Id在生成后保持不变 在ConstraintViolationException时,是否有一种常见的方法重新触发实体的@Id生成 我的实体定义: @实体 @Tab

我正在使用@GenericGenerator处理复合主键创建。在并发调用的情况下,它有时会因ConstraintViolationException而失败。我更愿意设置一个重试机制,而不是让一些并发POST调用失败。问题是我无法强制重新生成密钥

我曾尝试在失败时使用同一对象再次调用JpaRepositorysaveAndFlush,但@Id在生成后保持不变

在ConstraintViolationException时,是否有一种常见的方法重新触发实体的@Id生成

我的实体定义:

@实体 @Tablename=某个实体 公共类实体{ @可嵌入 公共静态类SomeEntityId实现可序列化{ 私人国际年; 私有整数; // ... } @嵌入ID @GenericGeneratorname=some\u实体\u id,strategy=SomeEntityIdGenerator @GeneratedValuegenerator=某些实体id 私人身份证; // ... } 发电机:

公共类SomeEntityIdGenerator实现IdentifierGenerator{ @凌驾 可公开序列化的GenerateSharedSessionCompactCompleteMentor会话, 对象对象抛出HibernateeException{ int year=getYearobject; int number=getNumberyear,session.connection; 返回新的SomeEntity.SomeEntitytIdyear,number; } 专用静态int GetNumberPrint年份,连接{ 试一试{ PreparedStatement语句=connection.prepareStatement 从某个_实体中选择maxrequest_编号,其中年份=?; statement.setInt1,年份; ResultSet rs=statement.executeQuery; 如果是下一个{ int max=rs.getInt1; 返回最大值+1; } 返回1; }捕获SQLE异常{ 抛出新的HibernateeException; } } // ... }
选择最大。。。为插入获取新的PID是众所周知的RDBMS反模式。不要这样做。我不想在这件事上和你作对,但你要求的解决办法真的,真的很折磨人。我不会接受我发现这个的承包商的代码!由于您需要一个唯一的整数键,可能还需要将年份数据分离到一个单独的列中,然后让默认的pid生成器(它将正确/自动地生成)处理pid…看起来您已经/已经/在一个单独的列中获得了年份!选择最大。。。为插入获取新的PID是众所周知的RDBMS反模式。不要这样做。我不想在这件事上和你作对,但你要求的解决办法真的,真的很折磨人。我不会接受我发现这个的承包商的代码!由于您需要一个唯一的整数键,可能还需要将年份数据分离到一个单独的列中,然后让默认的pid生成器(它将正确/自动地生成)处理pid…看起来您已经/已经/在一个单独的列中获得了年份!