简体   繁体   中英

one to Many mapping is not updating foreign key value

i create Employee Form where employee can select multiple skills from dropdown and when submit button clicke form will get saved and i have foreignkeys table formskills where formid and skillid willbe mapped according to the selection, but i am unable to acxchive this mapping, i have tried many solution from online nothing helped me

Skills Dropdown FE- Skills dropdown image

FE Payload Form-payload image

DB Tables: FormTable FormTable SkillTable: Skillstable FormSkills Table: Foreignkeys table


BE Entites Code

FormModel:

@Entity
@Table(name="forms")
@SequenceGenerator(name="seq", initialValue=25, allocationSize=100)
public class FormModel implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,generator = "seq")
    private Long formid;
    private String firstName;
    private String lastName;
    @Column(nullable=false)
    private String Email;
    private long mobileNumber;
    private int overalExperience;
    private int relaventExperience;
    private Date dateOfBirth;
    private String adarNumber;
    @Column(name="name_of_college")
    private String nameOfCollege;
    
    private String certificates;
    
    @OneToMany(mappedBy="formmodel",cascade=CascadeType.ALL,orphanRemoval=true)
    private List<SkillsModel> skills;

SkillsModel:

@Entity
@Table(name="skills")
public class SkillsModel implements Serializable{

    @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name="skill_id")
    private Integer skillid;
    
    @Column(name="skill_name")
    private String skillname;
    
    public SkillsModel() {}
    public SkillsModel(Integer skillid, String skillname) {
        super();
        this.skillid = skillid;
        this.skillname = skillname;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinTable(name="formskills",joinColumns = {@JoinColumn(name="skillid")},inverseJoinColumns = {@JoinColumn(name="formid")})
    private FormModel formmodel;
    
    
    public SkillsModel(Integer skillid, String skillname, FormModel formmodel) {
        super();
        this.skillid = skillid;
        this.skillname = skillname;
        this.formmodel = formmodel;
    }

Controller:

@CrossOrigin(origins = "http://localhost:4200")
@RestController
public class FormController {
    
    @Autowired
    private FormService service;
    
    
    @GetMapping("/getskills")
    public List<SkillsModel> getskills() {
        return service.getskills();
    }
    
    @PostMapping(value="/saveuser")
    public ResponseEntity<Object> createUser(@RequestBody FormModel model) {    
              System.out.println(model.getSkills().get(0));
             FormModel modelform=service.createuserform(model);
           
        URI location=ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(modelform.getFormid()).toUri();
        return ResponseEntity.created(location).build() ;
    }
    
    @GetMapping("/getforms")
    public List<FormModel> getformdata() {
         return service.getformdata();
    }

Service:

@Service
public class FormService {
    
    @Autowired
    private FormRepository formrepo;
    @Autowired
    private Skillsrepository skillsrepo;
    
    public FormModel createuserform(FormModel userform) {
           FormModel modelform=formrepo.save(userform);
        return  modelform;
    }
    
    public List<SkillsModel> getskills() {
        List<SkillsModel> getskills=new ArrayList<>();
        
        getskills=skillsrepo.findAll();
        for(SkillsModel model :getskills) {
            System.out.println(model.getSkillid() + model.getSkillname());
        }
        return getskills;
    }

    public List<FormModel> getformdata() {
         List<FormModel> formlist= formrepo.findAll();
         System.out.println(formlist);
        return formlist;
    }

I believe what you want is, when inserting a FormModel entity, the system should also insert all of the associated SkillsModel entities automatically, without iterating over the List and inserting each Skill one by one, is that correct?

If that's the case, make the following changes:

SkillsModel:

public class SkillsModel implements Serializable {

...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "formid")
    private FormModel formmodel;

...

}

FormService:

@Service
public class FormService {

...

    public FormModel createuserform(FormModel userform) {
    
        for (SkillsModel skill: userform.getSkills()) {
            skill.setFormmodel(userform);
        }
    
        FormModel modelform = formrepo.save(userform);
        return  modelform;
    }

...

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM