Java Hibernate 添加查询
Java Hibernate Add query
我在尝试将现有库存保留在预生产环境中时遇到问题。
我想做的实际上是在文本文件上循环并将该文件中的子字符串插入数据库。
这是我执行的 class :
public class RepriseStock {
私有静态会话会话;
public RepriseStock() {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
}
public static int insererPartenaires(String sCurrentLine, int i) {
String sql = "INSERT INTO PARTENAIRE(ID,"
+ "MVTSOC,"
+ " MVTAGR, "
+ "MVTNOMSOC,"
+ "MVTCPTTMAG,"
+ "DATEAGREMENT,"
+ "MVTCHAINE,"
+ "MVTRGPT,"
+ "MVTUNION,"
+ "MVTNOMMAG,"
+ "MVTTELSOC,"
+ "MVTADRMAG,"
+ "MVTVILMAG,"
+ "MVTMAIL,"
+ "MVTSITU)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
Query query = session.createSQLQuery(sql);
query.setInteger(0, i);
query.setInteger(1, Integer.parseInt(sCurrentLine.substring(0, 3)));
query.setInteger(2, Integer.parseInt(sCurrentLine.substring(3, 10)));
query.setString(3, sCurrentLine.substring(10, 34));
query.setInteger(4, Integer.parseInt(sCurrentLine.substring(48, 53)));
query.setString(5, sCurrentLine.substring(77, 83));
query.setInteger(6, Integer.parseInt(sCurrentLine.substring(86, 90)));
query.setInteger(7, Integer.parseInt(sCurrentLine.substring(90, 94)));
// union
query.setInteger(8, Integer.parseInt(sCurrentLine.substring(94, 98)));
// enseigne 30
query.setString(9, sCurrentLine.substring(248, 278));
// tel
query.setString(10, sCurrentLine.substring(278, 293));
// adresse
query.setString(11, sCurrentLine.substring(293, 323));
// ville
query.setString(12, sCurrentLine.substring(323, 348));
// mail
query.setString(13, sCurrentLine.substring(398, 448));
// situ
query.setString(14, sCurrentLine.substring(449, 452));
return query.executeUpdate();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Module de remplacement de méthode auto-généré
BufferedReader br = null;
RepriseStock rs = new RepriseStock();
try {
String sCurrentLine;
br = new BufferedReader(
new FileReader(
"C:\Users\test\Desktop\test\reprise de stock\nouveauFichierPREPROD.dat"));
int i = 0;
sCurrentLine = br.readLine();
while ((sCurrentLine = br.readLine()) != null) {
i++;
RepriseStock.insererPartenaires(sCurrentLine, i);
System.out.println("Nombre de fois : " + i);
}
System.out.println("total (" + i + " )");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
脚本执行后,我总共循环了1022次。但是数据没有持久化到oracle中table (Partenaire)
我的日志没有显示任何错误。
你看到问题了吗?
您似乎没有提交交易。
如果您希望每个更新都是一个单独的事务,请尝试将 session.beginTransaction();
移动到 insererPartenaires
方法的开头并将从该语句返回的 Transaction
对象捕获到一个变量中.然后,在每次更新后,确保在 Transaction
对象上调用 commit()
。
如果您希望所有更新都是同一个事务,请将 beginTransaction()
和 commit()
方法移动到 main 方法中的 while 循环周围。
另请注意,您在这里不必要地混合了静态和非静态。尝试将 public static int insererPartenaires(String sCurrentLine, int i)
更改为 public int insererPartenaires(String sCurrentLine, int i)
。然后直接使用实例化的 RepriseStock
对象来调用方法,而不是静态调用它。
您还需要将 private static Session session
更改为 private Session session
我在尝试将现有库存保留在预生产环境中时遇到问题。 我想做的实际上是在文本文件上循环并将该文件中的子字符串插入数据库。
这是我执行的 class :
public class RepriseStock { 私有静态会话会话;
public RepriseStock() {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
}
public static int insererPartenaires(String sCurrentLine, int i) {
String sql = "INSERT INTO PARTENAIRE(ID,"
+ "MVTSOC,"
+ " MVTAGR, "
+ "MVTNOMSOC,"
+ "MVTCPTTMAG,"
+ "DATEAGREMENT,"
+ "MVTCHAINE,"
+ "MVTRGPT,"
+ "MVTUNION,"
+ "MVTNOMMAG,"
+ "MVTTELSOC,"
+ "MVTADRMAG,"
+ "MVTVILMAG,"
+ "MVTMAIL,"
+ "MVTSITU)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
Query query = session.createSQLQuery(sql);
query.setInteger(0, i);
query.setInteger(1, Integer.parseInt(sCurrentLine.substring(0, 3)));
query.setInteger(2, Integer.parseInt(sCurrentLine.substring(3, 10)));
query.setString(3, sCurrentLine.substring(10, 34));
query.setInteger(4, Integer.parseInt(sCurrentLine.substring(48, 53)));
query.setString(5, sCurrentLine.substring(77, 83));
query.setInteger(6, Integer.parseInt(sCurrentLine.substring(86, 90)));
query.setInteger(7, Integer.parseInt(sCurrentLine.substring(90, 94)));
// union
query.setInteger(8, Integer.parseInt(sCurrentLine.substring(94, 98)));
// enseigne 30
query.setString(9, sCurrentLine.substring(248, 278));
// tel
query.setString(10, sCurrentLine.substring(278, 293));
// adresse
query.setString(11, sCurrentLine.substring(293, 323));
// ville
query.setString(12, sCurrentLine.substring(323, 348));
// mail
query.setString(13, sCurrentLine.substring(398, 448));
// situ
query.setString(14, sCurrentLine.substring(449, 452));
return query.executeUpdate();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Module de remplacement de méthode auto-généré
BufferedReader br = null;
RepriseStock rs = new RepriseStock();
try {
String sCurrentLine;
br = new BufferedReader(
new FileReader(
"C:\Users\test\Desktop\test\reprise de stock\nouveauFichierPREPROD.dat"));
int i = 0;
sCurrentLine = br.readLine();
while ((sCurrentLine = br.readLine()) != null) {
i++;
RepriseStock.insererPartenaires(sCurrentLine, i);
System.out.println("Nombre de fois : " + i);
}
System.out.println("total (" + i + " )");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
脚本执行后,我总共循环了1022次。但是数据没有持久化到oracle中table (Partenaire)
我的日志没有显示任何错误。
你看到问题了吗?
您似乎没有提交交易。
如果您希望每个更新都是一个单独的事务,请尝试将 session.beginTransaction();
移动到 insererPartenaires
方法的开头并将从该语句返回的 Transaction
对象捕获到一个变量中.然后,在每次更新后,确保在 Transaction
对象上调用 commit()
。
如果您希望所有更新都是同一个事务,请将 beginTransaction()
和 commit()
方法移动到 main 方法中的 while 循环周围。
另请注意,您在这里不必要地混合了静态和非静态。尝试将 public static int insererPartenaires(String sCurrentLine, int i)
更改为 public int insererPartenaires(String sCurrentLine, int i)
。然后直接使用实例化的 RepriseStock
对象来调用方法,而不是静态调用它。
您还需要将 private static Session session
更改为 private Session session