Search code examples
htmlspring-bootspring-data-jpahibernate-mappinghibernate-onetomany

onetomany mapping in hibernate spring boot


Entity Exercise Master

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@EnableAutoConfiguration
@Entity
@Table(name = "exercise_master")
public class Exercise_Master {

    private static final long serialVersionUID =1L;
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="Ex_id")
    private Integer Ex_id;
    
    
    @Column(name="Problem_statement")
    private String prob_statement;

    
    
    @OneToMany(cascade=CascadeType.ALL, targetEntity = Vm_Master.class)
    @JoinColumn(name="fk_Ex_id",referencedColumnName="Ex_id")
    private List<Vm_Master> vm_master;



    public Integer getEx_id() {
        return Ex_id;
    }



    public void setEx_id(Integer ex_id) {
        Ex_id = ex_id;
    }



    public String getProb_statement() {
        return prob_statement;
    }



    public void setProb_statement(String prob_statement) {
        this.prob_statement = prob_statement;
    }



    public List<Vm_Master> getVm_master() {
        return vm_master;
    }



    public void setVm_master(List<Vm_Master> vm_master) {
        this.vm_master = vm_master;
    }
    
}

another entity Vm_master


import org.springframework.transaction.annotation.Transactional;

@Entity
@Transactional
@Table(name="vm_master")
public class Vm_Master {

    private static final long serialVersionUID =1L;
    
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name="vm_id")
    private Long Vm_id;
    
    @Column
    private String Vm_uuid;
    
    @Column
    private String Vm_name;
    
    @ManyToOne
    @JoinColumn(name="fk_Ex_id")
    private Exercise_Master exercise_master;

    public Long getVm_id() {
        return Vm_id;
    }

    public void setVm_id(Long vm_id) {
        Vm_id = vm_id;
    }

    public String getVm_uuid() {
        return Vm_uuid;
    }

    public void setVm_uuid(String vm_uuid) {
        Vm_uuid = vm_uuid;
    }

    public String getVm_name() {
        return Vm_name;
    }

    public void setVm_name(String vm_name) {
        Vm_name = vm_name;
    }

    public Exercise_Master getExercise_master() {
        return exercise_master;
    }

    public void setExercise_master(Exercise_Master exercise_master) {
        this.exercise_master = exercise_master;
    }
    
    
}

Repository of both entity


public interface Exercise_MasterRepo extends JpaRepository<Exercise_Master,Long>{

}
//
public interface Vm_MasterRepo extends JpaRepository<Vm_Master, Long>{

}


Controller 
@PostMapping("/saveExercise")
      public String saveExercise(@ModelAttribute Exercise_Master ex,@ModelAttribute Vm_Master vm)
      {
          exer_repo.save(ex);
          vm_repo.save(vm);
          return "redirect:/AddExercise";
      }

HTML Page

<form th:action="@{/saveExercise}" th:object="${ex}" method="POST">
        <div class="form-group">
    <label for="prob_statement">Problem Statement :</label>
    <textarea class="form-control" id="prob_statement" name="prob_statement"  rows="2" required ></textarea><br>
    <label for="Vm_name">Vm_name:</label>
    <textarea class="form-control" id="Vm_name" name="Vm_name"   required ></textarea><br>
   
    <label for="Vm_uuid">Vm_uuid:</label>
    <textarea class="form-control" id="Vm_uuid" name="Vm_uuid"   required ></textarea><br>
                <button type="submit" id="submit" class="btn btn-primary">Save</button>
            </div>
            </form> 

while inserting the of all field in html page value foreign key of vm_master which is mapped to primary key of Exercise_master is not getting the value. all the other value are getting store in the database.

Exercise_master Vm_master


Solution

  • You are not setting anything to the exercise_master field in the Vm_master entity. There's no way for vm_master to know that you are trying to map the exercise master with it. You'll need to set exercise_master field in the Vm_master object before saving the vm_master. Try doing something like this

    @PostMapping("/saveExercise")
          public String saveExercise(@ModelAttribute Exercise_Master ex,@ModelAttribute Vm_Master vm)
          {
              exer_repo.save(ex);
              vm.setExercise_master(ex);
              vm_repo.save(vm);
              return "redirect:/AddExercise";
          }
    

    Let me know if this helps.