【问题标题】:Multiple sql inserts in spring bootSpring Boot 中的多个 sql 插入
【发布时间】:2016-07-28 13:31:07
【问题描述】:

我有如下代码:

Offre o = offreRepository.save(offre);
for(OffreCompetence offreCompetence : offre.getOffreCompetences()) {
    offreCompetence.setOffre(o);
    offreCompetenceRepository.save(offreCompetence);
}

如您所见,我第一次调用offreRepositoryOffre 插入数据库,然后我多次调用offreCompetenceRepositoryOffre 中的每个OffreCompetence 插入到数据库。

这里的问题是我多次连接到数据库。

没有其他方法可以一次性完成这些插入吗?

编辑:

我尝试添加这一行:

@OneToMany(cascade = CascadeType.ALL, mappedBy="offre")
   private Set<OffreCompetences> offreCompetences;

但是offreCompetences 没有添加到数据库中,当我检查日志文件时,我注意到 Hibernate 没有插入它们但我在数据库中找不到它们,我认为问题是当他尝试添加offreCompetences 他不知道Offre 的ID:

Hibernate: insert into offre (date_expiration, date_publication, duree_mission, email_sended, etat, niveau_experience, nombre_postulant, nombre_vue, poste, profil_recherche, titre, code_type_contrat, code_ville) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2016-07-28 16:08:13.237 DEBUG 10736 --- [nio-8080-exec-4] org.hibernate.SQL                        : insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)
Hibernate: insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)
2016-07-28 16:08:13.304 DEBUG 10736 --- [nio-8080-exec-4] org.hibernate.SQL                        : insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)
Hibernate: insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)
2016-07-28 16:08:13.339 DEBUG 10736 --- [nio-8080-exec-4] org.hibernate.SQL                        : insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)
Hibernate: insert into offre_competence (competence, niveau_requis, offre) values (?, ?, ?)

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    您需要确保在列表中的每个对象中都设置了父对象。 Cascade persist 将确保对象及其子对象被正确保存和链接。不幸的是,如果没有显式设置,它将不会在数据库中创建关系。

        for(OffreCompetence offreCompetence : offre.getOffreCompetences()) {
            offreCompetence.setOffre(offre);
        }
        Offre o = offreRepository.save(offre);
    

    【讨论】:

      【解决方案2】:

      在 offre.offreCompetences 关系上设置CascadeType

      @Entity
      public class Offre {
      
         @OneToMany(cascade = CascadeType.ALL, mappedBy="offre")
         private Set<OffreCompetences> offreCompetences 
         ...
      }
      
      @Entity
      public class OffreCompetences {
          @ManyToOne
          @JoinColumn(name = "..." )
          private Offre offre;
      }
      

      执行此操作后,offreCompetences 将在您保存offre 时保存。

      查看JPA docs 对应的CascadeType

      【讨论】:

      • 我意识到我们有一点语言障碍,但“我在数据库中找不到它们”是什么意思?你提交交易了吗?你是怎么找他们的?基本上,您确实需要提供一些关于您如何为我们提供帮助的详细信息。关于'他不知道Offre的id',hibernate应该为你处理这个映射。这 '?'日志中的只是占位符。
      • 感谢您的宝贵时间,感谢@KubenT 的回答,我已经解决了我的问题
      • 只是要指出,您的原始示例让您在 offreCompetency 中设置了 offre。您必须在两者之间删除它。 CascadeType 解决了您的问题。
      猜你喜欢
      • 2014-08-21
      • 2020-04-27
      • 2022-01-06
      • 2018-05-17
      • 1970-01-01
      • 2019-12-14
      • 2014-04-11
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多