弹簧启动时插入多个sql

时间:2016-07-28 13:31:07

标签: spring-boot spring-data-jpa

我的代码如下:

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

因为您可以看到我第一次调用offreRepositoryOffre插入数据库,然后我多次调用offreCompetenceRepository来插入每个OffreCompetence } {在Offre到数据库。

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

有没有其他方法可以一次进行这些插入?

编辑:

我尝试添加此行:

@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 (?, ?, ?)

2 个答案:

答案 0 :(得分:1)

在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时保存。

查看CascadeType的{​​{3}}。

答案 1 :(得分:1)

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

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