【问题标题】:Hibernate Many-to-Many, duplicates same record休眠多对多,重复相同的记录
【发布时间】:2011-10-28 06:54:24
【问题描述】:

我尝试了 Hibernate Mapping Many-to-Many using Annotations 以及 vaannila 中给出的示例。

http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html

        Set<Course> courses = new HashSet<Course>();
        courses.add(new Course("Maths"));
        courses.add(new Course("Computer Science"));

        Student student1 = new Student("Eswar", courses);
        Student student2 = new Student("Joe", courses);
        session.save(student1);
        session.save(student2);

这东西很好用。但是,如果我稍后尝试向现有学生添加另一门课程,例如,

        Set<Course> courses = new HashSet<Course>();
        courses.add(new Course("Science"));
        Student student = new Student("Eswar", courses);
        session.save(student);

它在表格中再次复制了学生 Eswar。

        +------------+--------------+
        | STUDENT_ID | STUDENT_NAME |
        +------------+--------------+
        |          1 | Eswar        |
        |          2 | Joe          |
        |          3 | Eswar        |
        +------------+--------------+

我不能将课程添加到现有的 Eswar 中吗? 非常感谢您对这个问题的帮助。

【问题讨论】:

    标签: hibernate many-to-many duplicates record


    【解决方案1】:

    您首先需要从数据库中获取学生,然后将课程添加到该对象,然后保存获取的对象。

    这样,您正在创建一个新的学生对象,这个新的学生对象在“ID”实例变量中有一个空值。在我看来,Hibernate 必须将此实例变量映射到主键以进行查找,如果找到 id,则更新记录,否则插入新记录..

    是的,如果您需要为现有学生添加课程,您可能希望首先从获取的学生对象中获取设置,然后在该集中添加课程,然后保存......否则新的哈希集将只包含新课程,之前的记录将被覆盖。

    【讨论】:

    • 您的答案是可以的,除了以“在我看来”开头的句子。 Session.save 总是尝试插入。它不会更新现有实体。
    • @JBNizet okz,我又查了一下,实际上在我的情况下,对象要么保存要么更新,基于对象中是否存在主键值......我再次检查并发现我们正在使用 session.saveOrUpdate(instance) 方法.....感谢纠正.....
    • Zohaib 和 JB Nizet,非常感谢您的大力支持!现在使用 saveOrUpdate() 可以正常工作。再次感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多