我有两张桌子:Customer(家长)和Orders(子元素).两者都由customerId映射(customer\u 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);
}

上述记录器.信息行记录了相同的状态,但当5分钟后在表中看到时,客户表使用的是旧值,而订单表使用的是更正后的值.这种行为只发生在5-6%的事务中.我在日志(log)中没有看到任何异常.

Customer

@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;

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字段的乐观锁定来保护自己.在互联网上阅读这个主题,你可能会很快看到更新客户行的并发事务是如何导致这种情况的.

Java相关问答推荐

java.lang. StackOverFlow错误:显示表及其依赖项时为空

在没有maven或IDE的情况下从命令行运行PFA模块化应用程序时出现神秘错误

Spring bootstrap @ Asmat注释与@ Routed

Java:根据4象限中添加的行数均匀分布行的公式

为什么一个java函数会返回一个作为参数传递给它的对象?

使用标记时,场景大纲不在多个线程上运行

Java记录的不同序列化/反序列化

如何正确创建序列图?

测试期间未执行开放重写方法

如何将其他属性引用到log4j2 yaml配置中?

如何在一行中使用Dijkstra中的Java Stream

为什么我的回收视图会显示重复的列表?

如何在Cosmos DB(Java SDK)中增加默认响应大小

Spring Validator批注不起作用

从12小时开始的日期模式

如何在Record Java中使用isRecord()和RecordComponent[]?

在实例化中指定泛型类型与不指定泛型类型之间的区别

保持标题窗格的箭头可见,即使设置为不可折叠

没有Google Play服务,Firebase Auth无法工作

ReturnedRect在升级后反转