2014-12-11 3 views
0

Я довольно новичок в спящем режиме, и я пытаюсь сохранить данные в таблице Student и присоединяться к таблице, которая содержит составной ключ ученика и соответствующую таблицу навыков учеников. Я использую Spring MVC и ферму для заполнения этих данных. Я чувствую, что неправильно отображаю либо в форме, либо в спящем режиме, но я не уверен, где я ошибся.Спящий режим не сохраняется в таблице сопоставления в ManyToMany

Форма:

<form action="/SpringMVCProject/submitAdmissionForm" method="POST"> 
    First name: <input type="text" name="studentFname" /> 
    <br> 
    Last name: <input type="text" name="studentLname" /> 
    <br> 
    Date of birth: <input type="text" name="studentDOB" /> 
    <br> 
    Mobile num: <input type="text" name="studentMobile" /> 
    <br> 
     Select skills: <select name="studentActivities.skill_id"> 
         <option value="1">Java</option> 
         <option value="2">C++</option> 
         <option value="3">C#</option> 
         <option value="4">.NET</option> 
         <option value="5">Python</option> 
         <option value="6">Ruby</option> 
        </select> 
    <br> 
    Country: <input type="text" name="studentAddress.country" /> 
    <br> 
    City: <input type="text" name="studentAddress.city" /> 
    <br> 
    Street: <input type="text" name="studentAddress.street" /> 
    <br> 
    Postal code: <input type="text" name="studentAddress.pincode" /> 
    <br> 
    <input type="submit" value="Submit" /> 


</form> 

Студент Класс:

@Entity 
public class Student { 
    @Id 
    @GeneratedValue 
    private int studentID; 

    private String studentFname; 

    @Size(min=5, max=8) 
    @Pattern(regexp="[a-z]*") 
    private String studentLname; 

    @Embedded 
    private Address studentAddress; 

    @Past 
    private Date studentDOB; 

    private Long studentMobile; 

    @ManyToMany(cascade = CascadeType.ALL) 
    private Set<StudentActivities> studentActivities = new HashSet<StudentActivities>(); 
} 

StudentActivities класс:

@Entity 
@Table(name="student_skills") 
public class StudentActivities {  
    @Id 
    @GeneratedValue 
    private int skill_id; 

    private String skill_name; 
} 

Вот как я спасаю его в классе контроллера:

@RequestMapping(value = "/submitAdmissionForm", method = RequestMethod.POST) 
public ModelAndView submitAdmissionForm(@Valid @ModelAttribute("student1") Student student1, BindingResult result) 
{ 
    ModelAndView model; 
    if(result.hasErrors()) 
     model = new ModelAndView("AdmissionForm"); 
    else 
    { 
     SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 

     session.beginTransaction(); 
     session.save(student1); 
     session.getTransaction().commit(); 

     session.close(); 
     sessionFactory.close(); 

     model = new ModelAndView("AdmissionSuccess"); 
    } 

    return model; 
} 

Так что в настоящее время он сохраняет все данные в таблице учеников, но не в моей таблице «Student_student_skills». В таблице «student_skills» уже есть данные, поэтому я не совсем уверен, что даже стоит иметь класс StudentActivities, так как я действительно не хочу вводить данные в таблицу «student_skills»? Однако основная проблема заключается в том, что данные фактически не сохраняются в таблице сопоставления. Где я здесь ошибся?

EDIT:

я смог его сохранить, создав объект StudentActivities и создание отдельной области в классе Student держать навык идентификатор и я просто использовал это, чтобы установить мастерство идентификатор в студенте не уверен, что это правильный способ сделать это. Похоже, что большинство учебных пособий я видел жесткий код записей в базе данных и позволяю hibernate выполнять эту работу, но в моем случае у меня уже были записи данных и вы хотели выбрать их из списка в форме. Единственная проблема заключается в том, что значения skill_name остаются нулевыми, так как я не указал имя_машины, и мне нужно их жестко закодировать, можно ли каким-либо образом предотвратить его обновление таблицы student_skills?

StudentActivities student_skills = new StudentActivities(); 
student_skills.setSkill_id(student1.getSkillID()); 
student1.getStudentActivities().add(student_skills); 
+0

Ьгу @ManyToMany (каскад = CascadeType.ALL, принеси = FetchType.EAGER), это будет делать присоединиться как полное внешнее соединение, по умолчанию внутреннее соединение, возможно, данные не попадают в таблицу student_skills, потому что соединение пустое. –

+0

Кажется, что не работает. Пожалуйста, см. Мой EIDT, мне удалось заставить его сохранить таблицу сопоставления, создав объект StudentActivities, но проблема заключается в том, что она переопределяет записи в таблице StudentActivities, если я не жестко кодирую имя активности – joe

ответ

-1

Вы можете использовать что-то вроде:

@ManyToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(name="Student_student_skills", 
       joinColumns={@JoinColumn(name="Student_ID")}, 
       inverseJoinColumns={@JoinColumn(name="Student_Skill_ID")}) 
private Set<StudentActivities> studentActivities = new HashSet<StudentActivities>(); 
+0

Все еще только вставляет в студент таблицы, если я это сделаю – joe

+0

Проверьте это: http://stackoverflow.com/a/12553056/1643465 –

Смежные вопросы