OneToMany集合中的实体未更新

时间:2019-01-13 16:12:06

标签: java hibernate jpa

假设以下模型:

@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脚本。

0 个答案:

没有答案