2015-05-20 2 views
2

Это мой код для вставки партии в базе данныхHibernate партии вставить

@Override 
    public void addMultiple(){ 

    session = get_session(); 
    tx = session.beginTransaction(); 
for (int i=0; i<100; i++) { 
Person person = new Person(); 
person.setName("oll"+i); 
session.save(person); 
if(i % 20 == 0) { // Same as the JDBC batch size 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
    } 
} 
tx.commit(); 
session.close(); 
} 

это мой hibernate.cfg.xml файл

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true</property> 
<property name="hibernate.connection.username">root</property> 
<property name="hibernate.connection.password"></property> 
<property name="hibernate.hbm2ddl.auto">update</property> 
<property name="hibernate.show_sql">true</property> 
<property name="format_sql">true</property> 
<property name="hibernate.jdbc.batch_versioned_data">true</property> 
<property name="hibernate.jdbc.batch_size">20</property> 
<property name="hibernate.order_inserts">true</property> 
<property name="hibernate.current_session_context_class">thread</property> 

но после операции вставки я могу увидеть запрос печатается в консоли

Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 
    Hibernate: insert into Person (name) values (?) 

Это означает, что он не вставляет партии. У моего объекта нет генерации идентификатора. Так в чем проблема? Почему я не могу вставить пакет?

Мой Entity класса являются

@Entity 
    public class Person { 

    @Id 
    public String name; 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 




} 
+0

См. Мой отредактированный ответ. Вы пытались использовать параметр 'profileSQL', чтобы проверить, перезаписывает ли драйвер MySQL? –

ответ

1

Очень вероятно, вы на самом деле с помощью пакетной обработки, это просто, что Hibernate печатает SQL для каждого оператора.

Чтобы проверить это, включите уровень журнала отладки для org.hibernate пакета (и уровень трассировки для org.hibernate.type, если вы хотите увидеть связанные переменные), то проверьте следующее отображается в журнале:

  • Повторного использование пакетного заявления

  • Выполнение размер партии

Если число больше 1 печатается для выполняемого размера партии, то вы используете дозирование.

Спецификация для MySQL, чтобы убедиться, что драйвер MySQL перезаписывает инструкции insert, включите параметр profileSQL в URL-адресе подключения, как описано here.

ПРИМЕЧАНИЕ: JDBC-дозирование - disabled, если используется идентификатор IDENTITY.

Я также предлагаю вам установить значение hibernate.order_updates в значение true, чтобы улучшить пакетную обработку операторов обновлений. Хорошее резюме об этой настройке Hibernate описано here.

Смежные вопросы