数据不一致:更新子表时未更新父表



我有两个表:客户(父级(和订单。两者都由
customerId(customer_id:unique key,在父项和子项中(映射。

在一些Impl类的代码中,我在实体、中设置字段后保存数据

...
String status = someObject.getStatus();
customer.setLastPurchageStatus(status);
order.setStatus(status);
....

并使用内置的"save"将其保存为:

try {
   LOGGER.info("Customer status:{}, Order statu:{}", customer.getLastPurchageStatus(), customer.getOrder().getStatus());
   customerRepo.save(customer);
} catch(Exception e) {
  LOGGER.info(e);
}

上面的LOGGER.info行记录了相同的状态,但当在5分钟后的表中看到时,Customer表使用旧值,而Order表使用更正值更新。这种行为只发生在5-6%的交易中。我在日志中没有看到任何异常。
实体如下:

客户

@TypeDefs({ @TypeDef(name = "json", typeClass = JsonStringType.class), })
@Entity
@Table(name = "customer")
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Customer implements java.io.Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -395898276179285945L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "customer_seq")
    private long customerSeq;
    @Column(name = "customer_id")
    private String customerId;
    @Column(name = "last_purchase_status")
    private String lastPurchageStatus;
   
    @JsonManagedReference
    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "Customer")
    private Set<Order> order;

订单

@Entity
@Table(name = "order")
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Order implements java.io.Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -4250363507869746908L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_seq")
    private String orderSeq;
    @Column(name = "order_id")
    private String orderId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_seq", referencedColumnName = "customer_seq")
    @JsonBackReference
    private Customer customer;
    @Column(name = "customer_id")
    private String customerId;
    @Column(name = "status")
    private String status;
   
    .......
    ...other getters/setters
    
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_seq", referencedColumnName = "customer_seq")
    public Customer getCustomer() {
        return customer;
    }
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
   
    .....

   

有什么帮助吗??

您可能在这里看到的效果被称为";丢失更新";现象,您可以通过使用带有@Version Long version字段的乐观锁定来保护自己免受这种现象的影响。阅读互联网上的主题,你可能会很快看到更新客户行的并发事务是如何导致这种情况的。

最新更新