强制hibernate在MySQL中的单个插入中插入批处理数据

时间:2013-09-07 13:27:50

标签: mysql hibernate batch-file insert

我们面临着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对象时,hibernate为表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次保存后刷新会话。

1 个答案:

答案 0 :(得分:2)

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

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

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