Я довольно новичок в спящем режиме, и я пытаюсь сохранить данные в таблице 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);
Ьгу @ManyToMany (каскад = CascadeType.ALL, принеси = FetchType.EAGER), это будет делать присоединиться как полное внешнее соединение, по умолчанию внутреннее соединение, возможно, данные не попадают в таблицу student_skills, потому что соединение пустое. –
Кажется, что не работает. Пожалуйста, см. Мой EIDT, мне удалось заставить его сохранить таблицу сопоставления, создав объект StudentActivities, но проблема заключается в том, что она переопределяет записи в таблице StudentActivities, если я не жестко кодирую имя активности – joe