Hibernate(JPA)在失败的插入上分配了ID

时间:2017-02-21 20:55:32

标签: java spring hibernate jpa

首先,我没有正确说英语,所以,对不起,这是错误的。

我遇到问题,当我尝试创建一个实体(id为NULL,然后数据库将分配它)并且创建失败时,实体将留下生成的ID。如果创建失败,我需要id保持为null,因为在我的服务中,我检查实体是否传递给“save”方法,是否包含ID,以进行更新或创建。

如果创建失败,我可以将ID设置为null,但是当我进行更复杂的事务时,很难手动更改每个实体中的每个ID,有时,某些对象是从数据库中获取的,而其他对象则不是。< / p>

我希望我已经正确解释了......谢谢。

PD:这是实体中的字段ID ......

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

PD2:我顺便使用Spring框架。

编辑:我使用PostgreSQL,尝试每一代都是可行的。

3 个答案:

答案 0 :(得分:2)

从设计的角度来看,你应该依赖异常而不是空值。

在您的服务中,您可以捕获异常,而不必添加if语句。

答案 1 :(得分:0)

很大程度上取决于您使用的数据库,生成方法和Hibernate方言。

在许多情况下,DB将分配ID,而Hibernate将只加载具有该值的字段。

看一下方言和Postgres,我认为你必须手动撤消id,因为postgres序列不受回滚(see this answer)的影响,因此即使对于失败的插入,hibernate也可以获得当前的ID。

您可以使用JPA生命周期注释来收集有关您的实体的足够信息,以便在保存失败后进行清理。

答案 2 :(得分:0)

if os.path.exists(foo): os.remove(foo) 生成策略通常不受欢迎,原因如下: 在IDENTITY操作之前,Hibernate无法生成标识符值。这就是Hibernate必须立即执行INSERT查询和INSERT的原因。这样,Hibernate将填充持久化实体实例的标识符值。

我认为PostgreSQL不支持SELECT id生成策略(Hibernate Identity, Sequence and Table (Sequence) Generator)。如果PostgreSQL支持IDENTITY策略,那么您的实体将不会初始化id,因为IDENTITY永远不会发生。