【问题标题】:Force hibernate to insert batch data in single insert in MySQL强制休眠在 MySQL 的单次插入中插入批处理数据
【发布时间】:2013-09-11 11:58:36
【问题描述】:

我们面临着 hibernate 如何处理多个插入的问题。

首先,我们有几个主键不是自动生成的类的实例。我们将它们保存在一个循环中,然后调用flush。但是hibernate会创建单独的插入查询,如hibernate log (show_sql)所示。这是正常的吗?我们可以让它使用单个插入而不是多个插入吗?

其次,看下面的代码:

public void saveCourse() {
    Course course = new Course();
    List<Student> studentList = new ArraryList();
    studentList.add(getStudentService().save(new Student(“hasan”,”askari”)));
    studentList.add(getStudentService().save(new Student(“ali”,”alavi”)));
    studentList.add(getStudentService().save(Student(“reza”,”rezaei”)));
    course.setStudents(studentList);
    getCourseService().save(course);    
}

course 对象被保存时,休眠为表course_student 创建单独插入。为什么?

这是我们的课程:

@Entity
@Table(name = "student ")
public class Student {
    private Long id;
    private String name;
    private String family;
    ….
}    

@Entity
@Table(name = "course ")
public class Course {
    private Long id;
    private List<Student> students;

    @OneToMany
    @JoinTable(name = "course_student")
   public List<Student> getStudents() {
        return students;
    }
    public void setStudents(List<Student> students) {
        this.students = students;
    }
}

Jdbc 批量大小为:hibernate.jdbc.batch_size=100,我们在每 100 次保存后刷新会话。

【问题讨论】:

  • 如果我理解正确,那是正确的行为。当您坚持 Course 时,Hibernate 将在 JoinTable 上插入记录。否则,课程将在没有任何学生的情况下持续存在。
  • 问题是为什么10个学生的课程要插入10个?为什么hibernate不通过一次插入来处理它?

标签: mysql hibernate batch-file insert


【解决方案1】:

您必须将此选项添加到休眠连接 URL:rewriteBatchedStatements=true

<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernateTest?rewriteBatchedStatements=true</property>

请注意,这不会更改休眠日志中的任何内容(通过设置 show_sql=true 生成)。即使在将此选项添加到 jdbc url 之后,它也会显示单独的插入。为确保它确实有效,您应该检查 mysql 日志。

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多