【问题标题】:Hibernate joining two tables休眠连接两个表
【发布时间】:2014-09-10 14:38:53
【问题描述】:

我正在尝试学习 Spring 和 Hibernate 。我有以下表格

在我的数据库表中插入表单值后,我希望它们如下所示:

表名:学生

student_id    studentName
  1.           Jason Stathum

表格名称:studentdetails

studentDetailsid   FatherName   MotherName    student_id
   1                 Mr.X          Mrs. Y        1

但是当我实际在我的数据库中插入值时,studentdetails 表如下所示

表格名称:studentdetails

studentDetailsid   FatherName   MotherName    student_id
   1                 Mr.X          Mrs. Y        NULL

如您所见,一切正常,但只有 student_id 列没有被填满。你能告诉我我做错了什么吗?

这是我的代码:

模型类:学生

package com.spring.org.model

@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, mappedBy = "student")
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>();

// Getters and Setters

模型类:StudentDetails

@Entity
@Table(name = "studentDetails")
public class StudentDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;

@ManyToOne
@JoinColumn(name="student_id")
private Student student;

// 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());     
    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";

}

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>
</table>

 <input type="submit" value="Save" />
</form:form>

StudentDaoImpl

@Override
public void addStudent(Student student) {

    Session session = getSessionFactory().openSession();
    Transaction tx;
    tx = session.beginTransaction();
    session.save(student);  

    tx.commit();
}

【问题讨论】:

    标签: java hibernate spring-mvc


    【解决方案1】:

    StudentDetails 中的student 属性中删除@JoinColumn 注释应该可以解决问题:

    @ManyToOne
    //@JoinColumn(name="student_id")
    private Student student;
    

    【讨论】:

    • 感谢您的回复。我刚刚删除了@JoinColumn(name="student_id") 并运行了我的应用程序,但它仍然无法正常工作。它将我的列名从student_id 更改为student_student_id。谢谢
    • 这很奇怪,student_id 应该是默认的列名。这里使用JoinColumn并没有错,应该是多余的。由于 StudentDetails 确实被存储,级联似乎正在工作 - 甚至更奇怪。
    • 如果您在保存学生后(可能是多余的)保存或合并学生详细信息,是否正确存储了外键?
    【解决方案2】:

    更改此片段:

    @ManyToOne
    @JoinColumn(name="student_id")
    private Student student;
    

    到:

    @ManyToOne
    private Student student;
    

    这应该有效。

    【讨论】:

    • 我的(之前的)答案有什么不同?
    • 我还是 NULL
    • @kostja 只是在编辑答案时竞争条件。无论如何,它似乎不起作用。
    • 两个错误不代表正确所以看起来:),没问题
    【解决方案3】:

    我已经设法解决了这个问题,我希望有一天这会对其他人有所帮助。 我对我的

    进行了一些更改

    模型类:学生

    @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
    

    然后从模型类中删除private Student student; 属性:StudentDetails。所以现在看起来像这样:

    模型类:StudentDetails

    @Entity
    @Table(name = "studentDetails")
    public class StudentDetails {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer studentDetailsId;
    private String FatherName;
    private String MotherName;
    
    // Getters and Setters
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 2015-12-04
      • 2013-04-20
      相关资源
      最近更新 更多