无法使用java的DeleteDbFiles.execute删除我的h2数据库文件 [英] can not delete my h2 database files with DeleteDbFiles.execute using java

查看:155
本文介绍了无法使用java的DeleteDbFiles.execute删除我的h2数据库文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用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".

I want delete h2 database files with DeleteDbFiles.execute("./data", "mydb", false), but getting following error : org.h2.message.DbException: Cannot delete file "dir/data/mydb.mv.db". and Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Cannot delete file "dir/data/mydb.mv.db".

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

I tried to close EntityManager em (em.close()) and EntityManagerFactory emf (emf.close()) then delete files but still getting same error. I tried to delete @persistencecontext from mainForm but still getting same error. this is my codes:

主要类别:

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:

and my 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()方法后的错误:

this is error after call restore() method:

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

推荐答案

只需像下面那样更改我的persistence.xml内容,然后在删除文件之前关闭EntityManagerFactory.

just change my persistence.xml content like below and before delete files close 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>

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

now can delete files using:

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

这篇关于无法使用java的DeleteDbFiles.execute删除我的h2数据库文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆