gpt4 book ai didi

java - 无法使用 java 使用 DeleteDbFiles.execute 删除我的 h2 数据库文件

转载 作者:行者123 更新时间:2023-12-02 01:32:29 25 4
gpt4 key购买 nike

我想使用DeleteDbFiles.execute("./data", "mydb", false)删除h2数据库文件,但出现以下错误:org.h2.message.DbException:无法删除文件“dir/data”/mydb.mv.db”。引起:org.h2.jdbc.JdbcSQLNonTransientException:无法删除文件“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

最佳答案

只需更改我的 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);

关于java - 无法使用 java 使用 DeleteDbFiles.execute 删除我的 h2 数据库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57546917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com