【问题标题】:Update history table with Old and New values using Spring Boot, JPA使用 Spring Boot,JPA 使用旧值和新值更新历史记录表
【发布时间】:2018-01-10 09:00:46
【问题描述】:

使用的技术: Spring BootSpring Data JPA

问题摘要:我有一个用例来更新 order_tracking 表,当 purchase_order 表中发生任何状态更改时

用户实体:

@Entity
@Access(AccessType.FIELD)
@Table(name = "USER")
public class User extends BaseEntity {
private static final long serialVersionUID = 1L;

  @Id
  @Column(length = 28)
  @GeneratedValue(generator = "USER")
  @SequenceGenerator(name = "USER", sequenceName = "USER")
  @Access(AccessType.PROPERTY)
  private Long id;

  @Column(unique = true)
  private String email;

  private String firstName;

  private String lastName;
}

用户表:

id  email_id       first_name    last_name
------------------------------------------
101 test@eg.com    Test          Example

采购订单实体:

@Entity
@Access(AccessType.FIELD)
@Table(name = "PURCHASE_ORDER")
public class PurchaseOrder extends BaseEntity {
  private static final long serialVersionUID = 1L;

  @Id
  @Column(length = 28)
  @GeneratedValue(generator = "PURCHASE_ORDER")
  @SequenceGenerator(name = "PURCHASE_ORDER", sequenceName = "PURCHASE_ORDER")
  @Access(AccessType.PROPERTY)
  private Long id;

  private Long userId;

  private String trackingNumber;

  private String status;
}

采购订单表:

id   user_id    tracking_number   status
-------------------------------------------
101  101        1001              DELIVERED

对于每个活动,状态将像这样在 order_tracking 表中更新

订单跟踪表:

id  order_id   old_status     new_status      date
-----------------------------------------------------------------
1   101        NULL           CREATED         2017-07-14 10:08:10
2   101        CREATED        REQUESTED       2017-07-14 22:08:10
3   101        REQUESTED      IN_TRANSIT      2017-07-15 12:08:10
4   101        IN_TRANSIT     DELIVERED       2017-07-15 22:18:10

当 purchase_order 表中的任何状态发生变化时,order_tracking 表需要更新新旧状态。

为此,我得到了建议here

但是,我的用例是在 purchase_order 表中的任何状态发生变化时更新 order_tracking 表。

任何人都可以帮助我实现这一目标的最佳方法。

【问题讨论】:

  • public void setStatus(String status) { if (!this.status.equalsIgnoreCase(status) { this.history.add(new OrderTracking(this, this.status, status); } this.status = status; }.

标签: spring hibernate spring-boot spring-data-jpa hibernate-envers


【解决方案1】:

一种侵入性方法显然是将其作为 bean 逻辑的一部分进行管理:

public void setStatus(OrderStatus status) {
  if ( this.status != null && !this.status.equals( status ) ) {
    this.history.add( new OrderStatusTransition( this, this.status, status ) );
  }
  this.status = status;
}

在此用例中,您将审核 OrderStatusTransition 实体。

从 Envers 的角度来看,这个转换实体甚至您的订单状态表都是完全没有必要的,因为您可以通过使用审计读取器查询来获取所需的相同信息来完成表示相同的数据。

这样做的好处是避免了您必须构建任何类型的挂钩或机制来跟踪状态何时发生变化,并且只需使用采购订单表和 Envers 即可自动为您完成这项工作。

然后,您只需构建一个业务方法,在运行时通过 AuditReader 查询获取所需更改的必要表示,而不是在数据操作和脏跟踪时尝试处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多