Hibernate不保存值的集合

4 java persistence hibernate

好吧,我现在已经在几个项目中使用了Hibernate,但在使用之前我没有学习它的复杂性.我开始查看使用JPA Annotations并与Spring集成的代码,一切运行良好.但是现在我想向我的学生讲授基本的Hibernate,并且我正在创建一个示例并使用文档教程第1章,我遇到了在一个持久化类中保存一组集合值的问题.

这是持久性阶级......

public class Student {
    private Long id;
    private String firstName;
    private String lastName;
    private Set<Course> courses = new HashSet<Course>();
    private Set<String> contactDetails = new HashSet<String>();

    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

映射文件......

<hibernate-mapping package="com.phoenixone.school.model">
    <class name="Student" table="student">
        <id name="id" column="studentId">
           <generator class="native" />
        </id>

        <property name="firstName" />
        <property name="lastName" />

        <set name="courses" table="student_course" lazy="false">
            <key column="studentId" />
           <many-to-many column="courseId" class="Course" />
        </set>

        <set name="contactDetails" table="contactDetails">
            <key column="studentId" />
            <element type="string" column="contactDetail" />
        </set>
    </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

DAO(保存部分)

public class StudentDaoHibernate {
    public void save(Student student){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        session.save(student);
        session.getTransaction().commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试部分......

public class TestStudentDaoHibernate {
    public static void main(String[] args) {
        CourseDaoHibernate courseDao = new CourseDaoHibernate();

        Course c1 = new Course();
        c1.setCourseCode("CWD");
        c1.setCourseName("Web Dev");
        courseDao.save(c1);

        Set<Course> courses = new HashSet<Course>();
        courses.add(c1);

        Student student = new Student();
        student.setFirstName("Bob");
        student.setLastName("Santos");
        student.setCourses(courses);
        student.getContactDetails().add("123456789");                 

                StudentDaoHibernate dao = new StudentDaoHibernate();
        dao.save(student);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行这些代码行时......

Session session = HibernateUtil.getSessionFactory().getCurrentSession()
session.beginTransaction();
Student student = (Student)session.createCriteria(Student.class)
             .add(Restrictions.eq("id", new Long(1))).uniqueResult();
System.out.println("First Name: " + student.getFirstName());
System.out.println("Last Name: " + student.getLastName());

System.out.println("Courses enrolled with...");
for(Course c:student.getCourses()){
    System.out.println(c.getCourseName());
}

System.out.println("Contact details...");
for(String s:student.getContactDetails()){
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

我得到的是这个......

名字:Bob
姓:Santos
课程注册...
Web Dev
联系方式...

这导致我得出字符串"123456789"未保存的结论.您认为我的代码有什么问题?谢谢!

Mar*_*ark 5

您需要为课程和contactDetails的set元素添加级联属性.这定义了对父实体执行的操作将应用于子实体.默认值为none,这就是为什么保存Student时保存的集合中没有子元素的原因.

添加cascade ="all,delete-orphan"将涵盖所有操作,但如果您愿意,可以限制更多.见这里的更多细节休眠4.3参考.