【问题标题】:Hibernate not saving into mapping table in ManyToManyHibernate 不保存到 ManyToMany 中的映射表中
【发布时间】: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


【解决方案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>();

【讨论】:

  • 如果我这样做,仍然只插入到学生表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多