首先,我没有正确说英语,所以,对不起,这是错误的。
我遇到问题,当我尝试创建一个实体(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,尝试每一代都是可行的。答案 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
永远不会发生。