gpt4 book ai didi

java - 用于创建和更新时间戳的触发器与 JPA @PrePersist 的优缺点

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:06 26 4
gpt4 key购买 nike

我正在构建一个新的网络应用程序,我正在使用 Spring、JPA/Hibernate 和 Postgres。我的一些表有 creation_ts 和 lastupdate_ts 列,它们是时间戳列,用于跟踪插入发生的时间和最后一次更新发生在一行上的时间。

我还对我的表中的列使用命名约定,因此作为设计策略,每个表都保证有两列 pkey,它是一个整数代理键,以及用于乐观锁定的版本。

我有两种方法可以使这些字段保持最新。

选项A:使用触发器

这是我现在的解决方案,我有两个 Postgres 触发器,它们在插入和更新时触发,并将使这些字段保持最新。我有两个类(class)。

@MappedSuperclass
public abstract class PersistableObject
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="pkey")
private Integer pkey;

@Version
@Column(name="version")
private Integer version;

public Integer getPkey()
{
return this.pkey;
}

public Integer getVersion()
{
return this.version;
}
}

我有

@MappedSuperclass
public class TimeStampedPersistableObject extends PersistableObject {

@Column(name = "creation_ts")
@Temporal(TemporalType.DATE)
@org.hibernate.annotations.Generated(value = GenerationTime.INSERT)
private Date creationTimestamp;

@Column(name = "update_ts")
@Temporal(TemporalType.DATE)
@org.hibernate.annotations.Generated(value = GenerationTime.ALWAYS)
private Date updateTimestamp;

public Date getCreationTimestamp()
{
return this.creationTimestamp;
}

public Date getUpdateTimestamp()
{
return this.updateTimestamp;
}
}

选项 B:使用 JPA 监听器

在这个选项中,我将使用 JPA 监听器来保持时间戳列是最新的。

我的问题:

这两种方法中哪种更好?正如我所看到的,这是我个人列出的每个选项的优缺点列表,我非常有兴趣听取其他人对这两种选择的体验。

选项 A 的优点:

  1. 数据库正在使用触发器进行更新,因此在运行网络应用程序的集群中不存在时钟偏差的危险。
  2. 如果非 JPA 应用程序访问数据库,则强制要求保留这两列。

选项 A 缺点:

  1. 必须在插入和更新后执行选择以读取触发器放置的值。
  2. 我正在使用 hibernate 注释来读回值

选项 B 的优点:

  1. 创建 DDL 时输入更少
  2. 插入和更新后无需从数据库中读回值
  3. 纯 JPA 注释没有 hibernate 特定注释

选项 B 缺点:

  1. 集群中时钟偏差的危险
  2. 每当 JPA 提供者决定调用不可预测的回调方法时设置的字段

如果您可以完全控制数据库和 Java 代码,您将如何为新应用解决此问题。

最佳答案

Have to do a select after the insert and update to read the values that the triggers put into place.

您可以使用 INSERT ... RETURNINGUPDATE ... RETURNING 来检索触发器更改的值,因此无需执行其他操作选择。

除此之外,我认为这取决于您的环境。如果应用程序是关键任务,并且如果这些列维护不当,将会严重失败,那么我会坚持使用触发器。

如果这只是为了在前端方便(并且它可以优雅地处理由于不正确的值引起的冲突),那么 JPA 方法可能更易于维护。

关于java - 用于创建和更新时间戳的触发器与 JPA @PrePersist 的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5249004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com