【问题标题】:Hibernate not saving collection of values休眠不保存值的集合
【发布时间】:2010-11-24 07:24:00
【问题描述】:

好的,我现在已经在几个项目中使用过 Hibernate,但在使用它之前我并没有了解它的复杂性。我从查看使用 JPA 注释并与 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
}

映射文件...

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

DAO(保存部分)

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

测试部分...

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);
    }
}

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

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);
}

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

名字:鲍勃
姓氏:桑托斯
注册的课程...
网页开发
联系方式...

这使我得出结论,未保存字符串“123456789”。 您认为我的代码有什么问题? 谢谢!

【问题讨论】:

  • 3 岁没有回答。我遇到了同样的问题...

标签: java hibernate persistence


【解决方案1】:

您需要为课程和联系人详细信息的设置元素添加级联属性。这定义了对父实体执行的操作将应用于子实体。默认值为 none,这就是为什么当您保存 Student 时,没有保存集合中的任何子元素。

添加 cascade="all,delete-orphan" 将涵盖所有操作,但如果您愿意,可以进行更多限制。有关详细信息,请参阅 Hibernate 4.3 参考中的 here

【讨论】:

  • 嗨,马克!我认为仅使用 Set 保存 Set 没有问题,因为它是值的集合而不是实体的集合。正如您所建议的,我已将 cascade="all" 添加到映射文件中的两个 元素中。不幸的是,我仍然得到相同的结果。
  • 链接失效x_X
  • 修复了断开的链接并添加了对 v4.3 的引用
【解决方案2】:

我建议创建一个 Contract 类并使用它而不是 String。这是一个更好的抽象,Hibernate 处理你的 Course 类的证据表明它也可以很好地与 Contract 一起工作。

【讨论】:

  • 感谢 duffymo 的建议。如果不是为了遵循教程,我也会制作一个 Contact 课程。:|您知道为什么它没有持续存在吗?
  • 不是现在,但也许我今晚会自己尝试并回复你。
  • 这里发生了什么!我有同样的问题,但在我的情况下我使用注释
  • 那是差不多八年前的事了。
  • stackoverflow.com/questions/5867130/hibernate-liststring 这是类似的情况,但由于某种原因,它对我不起作用。我错过了什么吗?
【解决方案3】:

session.save(student);之后尝试添加session.flush();

【讨论】:

  • 我解决了关联多对多未正确刷新的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2011-06-17
  • 2017-01-03
  • 2011-12-16
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多