Reputation: 1
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
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;
}
Upvotes: 0
Views: 68
Reputation: 652
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;
}
...
}
Upvotes: 0