我想使用DeleteDbFiles.execute(“ ./ data”,“ mydb”,false)删除h2数据库文件,但是出现以下错误: org.h2.message.DbException: Cannot delete file "dir/data/mydb.mv.db". Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Cannot delete file "dir/data/mydb.mv.db".

我试图关闭EntityManager em(em.close())和EntityManagerFactory emf(emf.close()),然后删除文件,但仍然遇到相同的错误。 我试图从mainForm删除@persistencecontext,但仍然收到相同的错误。 这是我的代码:

主要类别:

import...  public class Main { JalaliCalendar jalaliCalendar = new JalaliCalendar(); EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit"); List<LoginEntity> list = new ArrayList<>();  public Main(){     getData();     interance(); }  public void interance(){      if (!list.isEmpty()){          LoginForm loginForm = new LoginForm(list);         loginForm.setTitle("پنجره ورود");         loginForm.setContentPane(loginForm.mainpane);         loginForm.pack();         loginForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);         loginForm.setLocationRelativeTo(null);         loginForm.setVisible(true);      }else {          Wellcome wellcome = new Wellcome();         wellcome.setTitle("خوش آمدید");         wellcome.setContentPane(wellcome.mainpane);         wellcome.pack();         wellcome.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);         wellcome.setLocationRelativeTo(null);         wellcome.setVisible(true);      } }  public void getData(){     EntityManager em = emf.createEntityManager();     em.getTransaction().begin();     Query query = em.createQuery("from LoginEntity ");     list = query.getResultList();     em.getTransaction().commit();     em.close(); } public void getDiff(){     JalaliCalendar j1 = new JalaliCalendar();     j1.setYear(1398);     j1.setMonth(3);     j1.setDay(5);      JalaliCalendar j2 = new JalaliCalendar();     j2.setYear(1398);     j2.setMonth(2);     j2.setDay(5);      jalaliCalendar.getMonth();     jalaliCalendar.getDay();     j1.getMonth();     j1.getDay();     int m = jalaliCalendar.getMonth() -  j1.getMonth();     int d = jalaliCalendar.getDay() - j1.getDay();     int dif = (m * 30) + d;     System.out.println(dif);     System.out.println(j1.getDateByDiff(dif));  }  public static void main(String[] args) {     new Main(); } } 

我的欢迎表格:

import ...  public class Wellcome extends JFrame{ private JTextField tf_title; private JTextField tf_address; private JTextField tf_builders; private JRadioButton jb_yes; private JRadioButton jb_no; private JButton btn_next; public JPanel mainpane; private JPasswordField pf_p1; private JPasswordField pf_p2; EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit"); List<LoginEntity> list = new ArrayList<>();  public Wellcome() {     btn_next.addActionListener(new ActionListener() {         @Override         public void actionPerformed(ActionEvent actionEvent) {              saveData();         }     }); }  public void saveData(){     String title = tf_title.getText();     String address = tf_address.getText();     boolean kind = false;     if (jb_yes.isSelected()){         kind = true;     }else {         kind = false;     }      String builders = tf_builders.getText();     String p1 = String.valueOf(pf_p1.getPassword());     String p2 = String.valueOf(pf_p2.getPassword());     System.out.println(p1);     System.out.println(p2);     String pass = null;      if (title.isEmpty() || address.isEmpty() || !jb_no.isSelected() && !jb_yes.isSelected() || builders.isEmpty() || p1.isEmpty() || p2.isEmpty()){         JOptionPane.showMessageDialog(null, "تمام بخش ها را کامل کنید");     }else if (!p1.equals(p2)){         JOptionPane.showMessageDialog(null, "رمز عبورها یکسان نیستند");     }else{         pass = p1;         EntityManager em = emf.createEntityManager();         em.getTransaction().begin();         LoginEntity loginEntity = new LoginEntity();         loginEntity.setTitle(title);         loginEntity.setAddress(address);         loginEntity.setKind(kind);         loginEntity.setBuilders(builders);         loginEntity.setPass(pass);         em.persist(loginEntity);         em.getTransaction().commit();         em.close();         list.add(loginEntity);          LoginForm loginForm = new LoginForm(list);         loginForm.setTitle("پنجره ورود");         loginForm.setContentPane(loginForm.mainpane);         loginForm.pack();         loginForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);         loginForm.setLocationRelativeTo(null);         loginForm.setVisible(true);          dispose();     }  } 

}

我的登录表格:

import ...  public class LoginForm extends JFrame{ private JPasswordField pf_pass; private JButton btn_exit; private JButton btn_login; private JLabel lb_project; public JPanel mainpane;  public static List<LoginEntity> list = new ArrayList<>();  public LoginForm(List<LoginEntity> loginlist){     list = loginlist;     lb_project.setText(list.get(0).getTitle());      btn_login.addActionListener(new ActionListener() {         @Override         public void actionPerformed(ActionEvent actionEvent) {             Login();         }     });     btn_exit.addActionListener(new ActionListener() {         @Override         public void actionPerformed(ActionEvent actionEvent) {             //exit             System.exit(0);         }     }); }   public void Login(){     String pass = String.valueOf(pf_pass.getPassword());     if (pass.equals(list.get(0).getPass())){         MainForm mainForm = new MainForm(list);         mainForm.setTitle("چرتکه");         mainForm.setContentPane(mainForm.mainpane1);         mainForm.pack();         mainForm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);         mainForm.setLocationRelativeTo(null);         mainForm.setExtendedState(JFrame.MAXIMIZED_BOTH);         mainForm.setVisible(true);         dispose();      }else {         JOptionPane.showMessageDialog(null, "رمزعبور معتبر نیست");     } } 

我的主要形式:

import...  @PersistenceContext public class MainForm extends JFrame { EntityManagerFactory emf = Persistence.createEntityManagerFactory("NewPersistenceUnit");  public JPanel mainpane1; public JTable table1; private JTextField tf_price; private JTextArea ta_detail; private JButton btn_save; private JButton btn_edit; private JButton btn_delete; private JFormattedTextField tf_date; private JComboBox cb_mycards; private JButton btn_addWorker; private JComboBox cb_yorcard; private JComboBox cb_title; private JButton btn_mycard_window; private JButton btn_addyorcards; private JTextField tf_search; private JLabel lb_sum; private JButton btn_print; private JLabel lb_part_sum; private JScrollPane mainscroll; private JPanel firstpanel; private JPanel secenodpanel; private JTable table2; private JLabel lb_builders; private JLabel lb_project; private JButton btn_calc; List<PeymentsEntity> PeymentList; List<MycardsEntity> MycardList; List<WorkersEntity> workers; List<String> WorkersNameList = new ArrayList<>(); List<YourcardsEntity> numbers; JalaliCalendar jalaliCalendar = new JalaliCalendar(); List<LoginEntity> list = new ArrayList<>(); String res; String res2;  public MainForm(List<LoginEntity> loginlist) {     list = loginlist;     int year = jalaliCalendar.getYear();     int month = jalaliCalendar.getMonth();     int day = jalaliCalendar.getDay();     String m;     String d;      if (month <= 9) {         m = "0" + month;     } else {         m = String.valueOf(month);     }     if (day <= 9) {         d = "0" + day;     } else {         d = String.valueOf(day);     }     res = year + "/" + m + "/" + d;     res2 = year + "-" + m + "-" + d;     tf_date.setValue(res);     btn_addWorker.setVisible(false);     btn_addyorcards.setVisible(false);     lb_project.setText(list.get(0).getTitle());     lb_builders.setText(list.get(0).getBuilders());     if (!list.get(0).isKind()) {         //btn_calc.setVisible(false);     }     getPeymentData();     getWorkers();     FillMycardComboBox();       btn_calc.addActionListener(new ActionListener() {         @Override         public void actionPerformed(ActionEvent actionEvent) {              restore();          }     }); }  public void getPeymentData() {      EntityManager em = emf.createEntityManager();     em.getTransaction().begin();     javax.persistence.Query query = em.createQuery("from PeymentsEntity ");     PeymentList = query.getResultList();     em.getTransaction().commit();     em.close();      int price = 0;     for (PeymentsEntity p : PeymentList) {         price += p.getPrice();     }      lb_sum.setText(String.valueOf(price)); }  public void getMycardData() {      EntityManager em = emf.createEntityManager();     em.getTransaction().begin();     javax.persistence.Query query = em.createQuery("from MycardsEntity ");     MycardList = query.getResultList();     em.getTransaction().commit();     em.close(); }  public void FillMycardComboBox() {     for (MycardsEntity mc : MycardList) {         cb_mycards.addItem(mc.getName());     } }  public void restore() {      DeleteDbFiles.execute("./data", "mydb", false);     System.out.println("deleted");     try {         RunScript.execute("./data/mydb", "", "", "./test.sql", null, false);     }catch (SQLException e){         e.printStackTrace();     } }  public void backup() {      try {         Backup.execute("name.zip", "./data","mydata", true );     } catch (SQLException e) {         e.printStackTrace();     }  } } 

和我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>  <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"          version="2.1">  <persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>model.MycardsEntity</class> <class>model.PeymentsEntity</class> <class>model.WorkersEntity</class> <class>model.YourcardsEntity</class> <class>model.LoginEntity</class> <properties>     <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />     <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./data/mydb;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO" />     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>     <property name="hibernate.show_sql" value="true"/>     <property name="hibernate.format_sql" value="true"/>     <property name="hbm2ddl.auto" value="update"/> </properties> 

调用restore()方法后,这是错误:

Exception in thread "AWT-EventQueue-0" org.h2.message.DbException: Cannot delete file "D:/Java/hamid apps/IntellijProjects/JPADemo/data/mydb.mv.db" [90025-199] at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.store.fs.FilePathDisk.delete(FilePathDisk.java:178) at org.h2.store.fs.FileUtils.delete(FileUtils.java:67) at org.h2.tools.DeleteDbFiles.process(DeleteDbFiles.java:106) at org.h2.tools.DeleteDbFiles.process(DeleteDbFiles.java:91) at org.h2.tools.DeleteDbFiles.execute(DeleteDbFiles.java:75) at MainForm.backup(MainForm.java:723) at MainForm$14.actionPerformed(MainForm.java:308) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308) at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6589) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342) at java.desktop/java.awt.Component.processEvent(Component.java:6354) at java.desktop/java.awt.Container.processEvent(Container.java:2261) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4966) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2319) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4914) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4543) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4484) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2305) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) at java.desktop/java.awt.EventQueue.access$600(EventQueue.java:97) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Cannot delete file "D:/Java/hamid apps/IntellijProjects/JPADemo/data/mydb.mv.db" [90025-199] at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) ... 45 more 

===============>>#1 票数:0 已采纳

只需更改我的persistence.xml内容,如下所示,然后在删除文件之前关闭EntityManagerFactory。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"      version="2.1"> <persistence-unit name="NewPersistenceUnit"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>model.MycardsEntity</class> <class>model.PeymentsEntity</class> <class>model.WorkersEntity</class> <class>model.YourcardsEntity</class> <class>model.LoginEntity</class> <properties>     <property name="hibernate.connection.url" value="jdbc:h2:file:./data/mydata;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=NO"/>     <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>     <property name="hibernate.connection.username" value=""/>     <property name="hibernate.connection.password" value=""/>     <property name="hibernate.archive.autodetection" value="class"/>     <property name="hibernate.show_sql" value="true"/>     <property name="hibernate.format_sql" value="true"/>     <property name="hbm2ddl.auto" value="update"/> </properties> </persistence-unit> 

现在可以使用以下方法删除文件:

DeleteDbFiles.execute("./data", "mydb", false); 

  ask by user9753394 translate from so

本文未有回复,本站智能推荐: