我有两个表:客户(父级(和订单。两者都由
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
字段的乐观锁定来保护自己免受这种现象的影响。阅读互联网上的主题,你可能会很快看到更新客户行的并发事务是如何导致这种情况的。