【发布时间】:2014-12-11 01:40:58
【问题描述】:
我对休眠相当陌生,我正在尝试将数据保存到学生表和连接表中,该表包含学生的复合键和相关的学生技能表。我正在使用 spring MVC 和一个农场来填充这些数据。我觉得我在表单或休眠中映射错误,但我不确定我哪里出错了。
表格:
<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>();
}
StudentActivity 类:
@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”表中?然而,主要问题是数据实际上并未保存到映射表中。我这里哪里出错了?
编辑:
我能够通过创建一个 StudentActivities 对象并在 Student 类中创建一个单独的字段来保存技能 ID 来保存它,我只是用它来设置学生活动中的技能 ID,不确定这是否是正确的方法。似乎大多数教程我都看过硬编码数据库条目并让休眠完成工作,但在我的情况下,我已经有了数据条目并想从表单的列表中选择它们。唯一的问题是因为我没有指定 Skill_name 并且我必须硬编码它们,所以 Skill_name 值保留为空,有什么办法可以阻止它更新我的 student_skills 表?
StudentActivities student_skills = new StudentActivities();
student_skills.setSkill_id(student1.getSkillID());
student1.getStudentActivities().add(student_skills);
【问题讨论】:
-
试试@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER),这会将join做为full outer join,默认是inner join,可能是数据没有做进入 student_skills 表,因为连接为空
-
似乎没有用。请查看我的 EIDT,我设法通过创建 StudentActivities 对象将其保存到映射表中,但问题是它会覆盖 StudentActivities 表中的条目,除非我在活动名称中硬编码
标签: java spring hibernate spring-mvc