假设以下模型:
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<B> bs;
public B getB(long id) {
for(B b : bs)
if(b.getId() == id) {
return b;
}
}
}
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "a_id")
private A a;
private String someString;
}
然后我尝试更新某些实体B的属性:
@Transactional(rollbackFor = Exception.class)
public void doSomeWork() {
A a = aRepository.findById(/* some id */);
a.getB(/* */).setSomeString(/* some string */);
}
当方法返回时,我希望修改后的实体B将被更新(SQL UPDATE)。由于某种原因,它不会发生。我怀疑框架只知道对bs
集合的添加/删除,但是由于集合中的每个实例都应该是一个受管实体,因此框架应该知道这些更改。
不确定我在这里缺少什么。
编辑:
我创建了一个存储库来重现该问题:
https://github.com/mikomarrache/hibernate-spring-issue
如果注释MyServiceImpl
类的第25-27行,则执行第22行的保存。但是,如果取消注释这些行,则看起来第22行的保存将被忽略,但第27行的第二次保存已完成,并且当然会破坏名称的唯一约束。为了进行测试,只需运行单元测试。无需填充数据库,在启动时会在类路径上执行一个SQL脚本。