java - Hibernate:在多对多关系中添加实体会导致另一个实体不必要的更新

标签 java hibernate

使用 Hibernate,考虑到实体 Payment 和 Refund 之间的多对多关系,并使用 @Version 进行乐观锁定。

@Entity
class Payment {
    @Id
    @GeneratedValue
    public Long paymentId;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Refund> refunds = new ArrayList<Refund>();

    @Version
    private long version;
}

@Entity
public class DRefund {
    @Id
    @GeneratedValue
    private Long refundId;

    @ManyToMany(mappedBy = "refunds")
    private List<Payment> payments = new ArrayList<Payment>();

    @Version
    private long version;
}

如果我加载 Payment使用 Hibernate session 从数据库添加 Refund到它,然后保存 Refund使用 Hibernate session ,Payment数据库中的行也会更新:

insert into Refund (version, refundId) values (?, ?, ?)
update Payment set version=? where paymentId=? and version=?
insert into Payment_Refund (payments_paymentId, refunds_refundId) values (?, ?)

Payment没有以任何方式改变。这是必要的还是可以调整 hibernate 映射来避免这种行为?如果我删除 @VersionPayment没有更新。

感谢您的帮助!

最佳答案

可以使用@OptimisticLock注释配置此行为:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OptimisticLock(excluded = true)
private List<Refund> refunds = new ArrayList<Refund>();

关于java - Hibernate:在多对多关系中添加实体会导致另一个实体不必要的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973758/

相关文章:

java - JDK11之后WSIMPORT在哪里

java - Hibernate 延迟加载 - 获取列表中的列表项

java - hibernate 查询日期大于

java - 我在 hibernate(hibernate 3.5.5) 中遇到了 LikeExpression 的过期问题

java - 在下拉列表中显示从数据库中选择的数据

java - 使用谓词集合过滤集合并符合阈值

java - 像在 visual studio 中一样在 eclipse 中自动完成

Java:BufferedInputStream 的 available() 方法存在问题

java - 如何映射这个复合主键?

mysql - hibernate OneToOne 关系中的未知mappedBy