SpringDataJPA在运行模式下不持久化对象,但在调试模式下持久化对象

bihw5rsg  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(227)

我的应用程序运行方式很奇怪。事实上,在调试时,我可以清楚地看到我的对象被持久化在db上,但在运行模式下,jpa似乎不会持久化它们。以下是源代码中的代码片段:

@Entity
@Table(name = "a", schema="myschema")
public class A implements Serializable{
    @Id
    @Column(name = "id", unique = true, nullable = false)
    @NotNull(message = "id can not be null")
    private UUID id = UUID.randomUUID();

    @JsonIgnore
    // @ManyToMany(fetch = FetchType.EAGER)
    @ManyToMany
    @JoinTable(name = "a_b", joinColumns = { @JoinColumn(name = "a_id") },
    inverseJoinColumns = { @JoinColumn(name = "b_id") }
  )
  private List<b> blist = new ArrayList<>();

  //omitted source code
}

@Entity
@Table(name = "b", schema="myschema")
public class B implements Serializable{
  @Id
  @Column(name = "id", unique = true, nullable = false)
  @NotNull(message = "id can not be null")
  private Integer id;

  @ManyToMany(mappedBy = "blist")
  @JsonIgnore
  private List<A> alist = new ArrayList<>();

  //omitted source code
}

 @Service
 public class MyService{
   //omitted source code
   public Optional<A> createCopy(A source, int bId) {
     B b = bRepository.findById(bId);
     A copy_ = this.copy(source);
     A target = aRepository.save(copy_);
     b.getAlist().add(target);
     bRepository.save(b);
     return Optional.of(target);
   }

   private A copy(A source){
     A target = new A();
     //copy one to one from source to target
     target.setB(source.getB());
     return target;
   }
 }

调试时我可以看到,打电话给 MyService#createCopy() 方法,新记录将持久化到表中的数据库中 a_b . 但是,当我运行服务器,然后继续调用 MyService#createCopy() ,中没有其他记录 a_b 得到持久化。
以前有人遇到过这种奇怪的行为吗?如果是的话,请怎么解决?

jckbn6z7

jckbn6z71#

看起来您在服务中没有再次将新列表设置为b objet,这就是为什么您无法在表a\u b中获取记录的原因。更改您的服务如下。

@Service
 public class MyService{
   //omitted source code
   public Optional<A> createCopy(A source, int bId) {
     B b = bRepository.findById(bId);
     A copy_ = this.copy(source);
     A target = aRepository.save(copy_);
    List<A> alist= b.getAlist();// Here b.getAlist() will return a independent list and adding any item within this list will not affect the list inside the object b.
     alist.add(target);
     b.setAlist(alist);// setting the new list to object b.
     bRepository.save(b);
     return Optional.of(target);
   }

试一次,让我知道它是否有效。

g6ll5ycj

g6ll5ycj2#

我成功地解决了以下问题(感谢@ajit hint):

private A copy(A source){
     A target = new A();
     //copy one to one from source to target
     //instead of target.setB(source.getB()); I did this
     List<B> targetBlist = target.getBlist();
     source.getBlist().forEach(bObj -> {
        Optional<B> optB = bRepository.findById(bObj.getId());
        if(optB.isPresent())
          targetBlist.add(optB.get());
     });
     return target;
   }

既然我的问题已经解决了,我仍然不知道真正的问题是什么。闻起来好像这和延迟加载有关。事实上,唯一没有出现问题的情况是当我检查 source#bList 在进行测试之前 copy() . 如果有人能向我澄清这一点,我将不胜感激。

相关问题