当前位置: 首页 > 面试题库 >

基于“标识”列的“ JPA派生列”值

谭兴学
2023-03-14
问题内容

JPA 2.0(Hibernate 4.2.4.Final/Spring 3.2.8.Release)/ Mysql 5.6

对于管理实体E w /自动生成的主键,例如

...
@Id
@GeneratedValue
private int id;

@Column
private String foo;

@Version
@Column(name="mod_date")
private Timetamp modDate;
...

出于传统原因,foo需要等于:{id}:。例如,如果id为204,则foo将为“:204:”,因此在事务中发生这种情况是可行的

em.persist(e);
em.detach(e);
e = em.find(e.getId());
e.setFoo(":" + e.getId() + ":");
...

有没有一种更好的方法来计算值取决于生成的ID的派生列?没有上述技巧,即在持久化之后直接更新列将导致org.hibernate.StaleObjectException。我在单元测试中看到了这种情况(实际上,我可以逐步执行单元测试代码,并且可以复制异常,该异常排除了通常与StaleObjectException关联的多线程问题。


问题答案:

您可以使用JPA PostPersist事件监听器来处理。

@Id
@GeneratedValue
private int id;

@Column
private String foo;

@PostPersist
public void onSave(){
    foo = ":" + id + ":";
}

根据JPA 2规范:

在使实体成为持久性或删除实体后,将为该实体调用PostPersist和PostRemove回调方法。这些回调还将在这些操作所级联的所有实体上调用。在数据库插入和删除操作之后,将分别调用PostPersist和PostRemove方法。这些数据库操作可以在调用持久,合并或删除操作之后直接发生,也可以在发生刷新操作后立即发生(可能在事务结束时)。
生成的主键值在PostPersist方法中可用。



 类似资料:
  • 我是火花和scala新手。我有一个json数组结构作为输入,类似于下面的模式。 我将数组结构展平到下面的示例数据帧 我的最终目标是为数据质量度量的每一列计算存在/不存在/零计数。但在计算数据质量指标之前,我正在寻找一种方法,为每个数组列元素派生一个新列,如下所示: 如果特定数组元素的所有值都为空,则该元素的派生列为空 如果数组元素至少存在一个值,则将元素存在视为1 如果数组元素的所有值均为零,则我

  • 我在尝试创建一个带有计算平均列的视图时遇到了一些麻烦,对于每个电影行,我都需要一个基于分级表中该电影的所有分级的平均分级。 电影表: 评级表: 以下是我目前掌握的情况: 它告诉我派生表需要自己的别名,我不知道这是否真的给出了每行的平均值。

  • 我想知道正确的JPA注释设置来处理MS Server2008 R2标识列。 MS Server 2008 R2(RTM)不支持序列,但当我使用原始SQL测试时,标识会自动递增。 但是,在JPA中,我不能通过任何策略(IDENTITY、AUTO、TABLE)在@generatedvalue注释上使其工作,而且我不允许更改DB模式,因为它是其他的。我没有尝试用顺序,因为没有顺序。 由于在ID上传递nu

  • 我正在使用pyspark下面是我的数据

  • 以下是我的项目中定义的实体: 如您所见,聚合只从孩子的角度进行跟踪:由于设计选择,没有关系。 但是,我想在实体中添加一个字段。这个字段应该被急切地加载(因为它总是在我的用例中被读取,语句并没有那么昂贵……我猜) 以下是我目前知道的选项: > 使用或注释:将有选择语句 检索帖子,然后调用另一个存储库方法,该方法使用中的 中设置50个参数长的