Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring Boot,JPA使用新旧值更新历史记录表_Spring_Hibernate_Spring Boot_Spring Data Jpa_Hibernate Envers - Fatal编程技术网

使用Spring Boot,JPA使用新旧值更新历史记录表

使用Spring Boot,JPA使用新旧值更新历史记录表,spring,hibernate,spring-boot,spring-data-jpa,hibernate-envers,Spring,Hibernate,Spring Boot,Spring Data Jpa,Hibernate Envers,使用的技术:Spring Boot,Spring Data JPA 问题摘要:当采购订单表的状态发生任何变化时,我有一个更新订单跟踪表的用例 用户实体: @Entity @Access(AccessType.FIELD) @Table(name = "USER") public class User extends BaseEntity { private static final long serialVersionUID = 1L; @Id @Column(length = 28)

使用的技术:
Spring Boot
Spring Data JPA

问题摘要:当采购订单表的状态发生任何变化时,我有一个更新订单跟踪表的用例

用户实体:

@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
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
用户表:

@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
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
采购订单实体:

@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
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
采购订单表:

@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
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
对于每个活动,状态将在订单跟踪表中更新,如下所示

订单跟踪表:

@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
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
当采购订单表中的任何状态发生变化时,订单跟踪表需要更新为新旧状态

为了实现这一点,我得到了一些建议

但是,我的用例是在采购订单表中的任何状态更改时更新订单跟踪表


有人能帮我找到实现这一点的最佳方法吗。

一种侵入性的方法显然是将其作为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
查询获取所需更改的必要表示,而不是在数据操作和脏跟踪时尝试处理这些更改。

public void setStatus(String status){if(!this.status.equalsIgnoreCase(status){this.history.add(新订单跟踪(this,this.status,status);}this.status=status;}