在利用hibernate向資料庫插入資料的時候發現總共2000多個資料只能插入一部分到資料庫中,debug的時候發現在循環中確實是建立了物件並且呼叫了save()
方法的
我的程式碼如下
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String file = "src/1.xlsx";
InputStream is = null;
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
XSSFWorkbook xssfWorkbook = null;
try {
xssfWorkbook = new XSSFWorkbook(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 获取每一个工作薄
for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
if (xssfSheet == null) {
continue;
}
// 获取当前工作薄的每一行
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow != null) {
XSSFCell one = xssfRow.getCell(0);
XSSFCell two = xssfRow.getCell(1);
XSSFCell three = xssfRow.getCell(2);
String name = getValue(three);
String code;
if (getValue(one).equals("沪市"))
code = "sh" + getValue(two);
else
code = "sz" + getValue(two);
StockName2Code s = new StockName2Code();
s.setCode(code);
s.setName(name);
session.save(s);
if (rowNum % 20 == 0) {
session.flush();
session.clear();
}
}
}
}
tx.commit();
session.close();
sessionFactory.close();
我的設定檔如下
` <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!-- 表示使用 mysql 数据库驱动类 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- jdbc 的连接 url 和数据库 -->
<property name="connection.url">jdbc:mysql://*******/******?useUnicode=true&characterEncoding=UTF-8</property>
<!-- 数据库用户名 -->
<property name="connection.username">root</property>
<!-- 密码(这里为空) -->
<property name="connection.password">********</property>
<!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property> -->
<!-- 数据库使用的方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- Echo all executed SQL to stdout -->
<!-- 设置 打印输出 sql 语句 为真 -->
<property name="show_sql">true</property>
<!-- 设置格式为 sql -->
<property name="format_sql">true</property>
<!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<mapping class="pojo.StockName2Code" />
</session-factory>
</hibernate-configuration> `
#雖然並沒有拋出記憶體用完的異常,但是因為在搜尋的時候發現可能是由於hibernate快取的問題,所以加上了每20個強制刷新的程式碼區塊,但是最後發現還是沒有效果,插入操作還是只能進行一部分,不知道還有沒有什麼可能的原因?
hibernate已經設定為show_sql了,印出來sql數量跟excel資料數量一致嗎