【问题标题】:Spring data jpa save弹簧数据 jpa 保存
【发布时间】:2015-07-17 13:07:32
【问题描述】:

我怎样才能通过考试? (在迁移我的代码以使用存储库之前正在工作)。 bs 保存后存储在数据库中,但对象没有更新。我必须做些什么来实现它?

鉴于这些类:

@Entity
public class A {
   @Id
   private String id;
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @JoinColumn(name = "aId")
   private Set<B> bs= new HashSet<B>();
   ...
}

@Entity
public class B {
   @Id
   @GeneratedValue
   private int id;
   private String aId;
   private String foo;
   ...
}

和存储库:

@RepositoryDefinition(domainClass = A.class, idClass = String.class)
public interface ARepository {
   ...
   void save(A a);
   ...
}

此测试失败:

    // "a" saved and flushed
    B b = new B();
    b.setAId(a.getId());
    a.getBs().add(b);
    ARepository.save(a);
    assertTrue(b.getId() > 0);

【问题讨论】:

    标签: java spring jpa spring-data


    【解决方案1】:

    repository.save() 执行 persist(如果提供的参数是瞬态的)或 merge(否则)。

    由于a 不是瞬态的,所以会执行merge,这意味着没有可以级联到bspersist 操作。

    您要么必须明确保存b,要么在保存a 之前将b 添加到新的a,以便persist 正确级联。

    【讨论】:

      【解决方案2】:

      可能的原因是 B 对象还没有处于持久状态。一旦它被保存 - 你不应该得到错误。

      应该是这样的:

      // "a" saved and flushed
      B b = new B();
      BRepository.save(b)
      b.setAId(a.getId());
      a.getBs().add(b);
      ARepository.save(a);
      assertTrue(b.getId() > 0);
      

      还请您提供堆栈跟踪吗?会很有帮助的。

      【讨论】:

      • 在使用session.save之前不用单独保存对象来获取Id,没有办法持久化B?,没有stackTrace,断言失败。跨度>
      • 我明白了,我实际上重新创建了您的测试并且一切正常。我创建存储库的唯一区别是:public interface ARepository extends CrudRepository&lt;A, String&gt;{} 您能否提供您的配置?
      猜你喜欢
      • 2016-07-09
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2016-06-02
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多