Java ManyToOne-保存时未设置外键
我正在使用Hibernate和SpringMVC。我有以下表格 当我提交表单时,我希望我的数据库表填写如下: 表名:学生Java ManyToOne-保存时未设置外键,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我正在使用Hibernate和SpringMVC。我有以下表格 当我提交表单时,我希望我的数据库表填写如下: 表名:学生 student_id studentName 1. Jason Stathum @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="student
student_id studentName
1. Jason Stathum
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="student_id", nullable= false)
private Integer studentId;
private String studentName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="student_id", referencedColumnName="student_id")
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>();
// Getters and Setters
表名:studentdetails
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y 1 1
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y NULL 1
city_ID city_name
1 NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;
// Getters and Setters
但是当我实际运行我的应用程序并插入表单数据时,除了列city\u id
没有被填满之外,其他一切都正常工作。该表如下所示:
表名:studentdetails
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y 1 1
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y NULL 1
city_ID city_name
1 NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;
// Getters and Setters
仅供参考,我还有一个名为city的表,如下所示
表名:studentdetails
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y 1 1
studentDetailsid FatherName MotherName city_id student_id
1 Mr.X Mrs. Y NULL 1
city_ID city_name
1 NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;
// Getters and Setters
我已经在下面列出了我的代码,你能告诉我如何解决这个问题吗
多谢各位
实体:学生
student_id studentName
1. Jason Stathum
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="student_id", nullable= false)
private Integer studentId;
private String studentName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="student_id", referencedColumnName="student_id")
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>();
// Getters and Setters
实体:城市
@Entity
@Table(name = "CITY")
public class City {
@Id
@Column(name="city_ID")
@GeneratedValue
private int cityId;
@Column(name="city_name")
private String cityName;
// Getters and Setters
控制器
@RequestMapping(value="addstudent", method = RequestMethod.GET)
public String addStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map)
{
map.addAttribute("student", new Student());
List<City> myCities = subService.getCity();
map.addAttribute("city", myCities);
return "addStudent";
}
@RequestMapping(value="addstudent", method = RequestMethod.POST)
public String saveStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map)
{
studentService.addStudent(student);
map.addAttribute("success", "Submitted");
return "msg";
}
我的表单:addStudent.jsp
<c:url var="saveUrl" value="/addstudent" />
<form:form modelAttribute="secret" method="POST" action="${saveUrl}">
<table>
<tr>
<td><form:label path="studentName">Student Name:</form:label></td>
<td><form:input path="studentName"/></td>
</tr>
<tr>
<td><form:label path="studentDetails[0].fatherName">Father Name:</form:label></td>
<td><form:input path="studentDetails[0].fatherName"/></td>
</tr>
<tr>
<td><form:label path="studentDetails[0].motherName">Mother Name:</form:label></td>
<td><form:input path="studentDetails[0].motherName"/></td>
</tr>
<tr>
<td><label>City</label></td>
<td><form:select path="studentDetails[0].city">
<c:forEach var="row" items="${city}">
<option value="${row.cityId}">${row.city}</option>
</c:forEach>
</form:select>
</td>
</tr>
</table>
<input type="submit" value="Save" />
</form:form>
学生姓名:
父亲姓名:
母亲姓名:
城市
${row.city}
我在这里猜测,是不是在输入记录时,您实际上没有选择一个城市,而是输入了一个学生姓名、父亲姓名和母亲姓名,并将该城市显示在列表中的第一个城市,碰巧是“纽约”。也许您可以添加一个额外的“请选择”选项,使用验证器强制您选择一个城市
另外,我注意到您在某些地方使用city\u id,而在其他地方使用city\u id。您的数据库对列名不区分大小写吗?我已经设法解决了这个问题:)我在HTML表单中做了一些更改,现在可以使用了
<tr>
<td><label>City</label></td>
<td><form:select path="studentDetails[0].city.cityId">
<c:forEach var="row" items="${city}">
<option value="${row.cityId}">${row.cityName}</option>
</c:forEach>
</form:select>
</td>
</tr>
城市
${row.cityName}
您正在设置城市名称
而不是学生
中城市
的id
,谢谢您的回复。我尝试了额外的“请选择”选项,但它不起作用。我使用city\u ID
来引用我的city
表,我使用city\u ID
来引用studentDetails
表中的外键列。我认为我的数据库对列名不区分大小写。谢谢