Java 如何将父表中的行删除到子表中的引用列?
我在javaFx项目和SQlite数据库中使用JDBC。我有两个表Java 如何将父表中的行删除到子表中的引用列?,java,jdbc,sqlitejdbc,Java,Jdbc,Sqlitejdbc,我在javaFx项目和SQlite数据库中使用JDBC。我有两个表“PROJECT”和“SMAllPROJECT”,例如PROJECT具有此结构PROJECT(名称、日期、状态)和SMAllPROJECT具有此结构SMAllPROJECT(名称、日期、状态、*项目名称*)项目名称引用自项目表的名称列 我正在尝试从PROJECT中删除行,应该删除SMAllPoject中引用的行。在sqlitestudio中,当我从父表中应用delete行时,我配置了onCascade方法,当我在sqlitestu
“PROJECT”
和“SMAllPROJECT”
,例如PROJECT具有此结构PROJECT(名称、日期、状态)
和SMAllPROJECT
具有此结构SMAllPROJECT(名称、日期、状态、*项目名称*)
<代码>项目名称引用自项目表
的名称
列
我正在尝试从PROJECT
中删除行,应该删除SMAllPoject
中引用的行。在sqlitestudio中,当我从父表中应用delete行时,我配置了onCascade
方法,当我在sqlitestudio中测试它时,一切都很好,但在我的代码中,它只是从父表中删除了行
这是我的代码:
控制器方法
public void ExecuteDeleteProject() {
if (!SearchIdProjectSupp.getText().isEmpty()) {
Project project = new ProjectDao().FindString(SearchIdProjectSupp.getText());
new ProjectDao().Delete(project);
String title = "Suppression";
String message = "Vous avez supprimé le projet " + SearchIdProjectSupp.getText() + ".";
NotificationType notification = NotificationType.SUCCESS;
TrayNotification tray = new TrayNotification();
tray.setTitle(title);
tray.setMessage(message);
tray.setNotificationType(notification);
tray.setAnimationType(AnimationType.SLIDE);
tray.setImage(new Image("Images/check.png"));
tray.setRectangleFill(Paint.valueOf("#a8a9fe"));
tray.showAndDismiss(Duration.seconds(4));
SearchIdProjectSupp.setText("");
SuppPaneProject.setVisible(false);
DeleteProjetButton.setDisable(true);
CountP.setVisible(true);
CountP();
CountR();
CountPP();
}
}
public boolean Delete(Project Object) {
try {
String queryDeletePerson = "DElETE FROM PROJECT WHERE name=" + "'" + Object.getName() + "'";//Query Insertion in Person_Table
PreparedStatement preparedStatementPerson = Dbaconnection.getConnection().prepareStatement(queryDeletePerson);//Prepared statement i use this for high performance
preparedStatementPerson.execute();
} catch (SQLException ex) {
Logger.getLogger(EMPDao.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
}
DAO模式方法
public void ExecuteDeleteProject() {
if (!SearchIdProjectSupp.getText().isEmpty()) {
Project project = new ProjectDao().FindString(SearchIdProjectSupp.getText());
new ProjectDao().Delete(project);
String title = "Suppression";
String message = "Vous avez supprimé le projet " + SearchIdProjectSupp.getText() + ".";
NotificationType notification = NotificationType.SUCCESS;
TrayNotification tray = new TrayNotification();
tray.setTitle(title);
tray.setMessage(message);
tray.setNotificationType(notification);
tray.setAnimationType(AnimationType.SLIDE);
tray.setImage(new Image("Images/check.png"));
tray.setRectangleFill(Paint.valueOf("#a8a9fe"));
tray.showAndDismiss(Duration.seconds(4));
SearchIdProjectSupp.setText("");
SuppPaneProject.setVisible(false);
DeleteProjetButton.setDisable(true);
CountP.setVisible(true);
CountP();
CountR();
CountPP();
}
}
public boolean Delete(Project Object) {
try {
String queryDeletePerson = "DElETE FROM PROJECT WHERE name=" + "'" + Object.getName() + "'";//Query Insertion in Person_Table
PreparedStatement preparedStatementPerson = Dbaconnection.getConnection().prepareStatement(queryDeletePerson);//Prepared statement i use this for high performance
preparedStatementPerson.execute();
} catch (SQLException ex) {
Logger.getLogger(EMPDao.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
}
这是我的DDL
CREATE TABLE PROJECT (
NAME VARCHAR2 (100) PRIMARY KEY,
STATE VARCHAR2 (100),
DATEDBT DATE,
);
CREATE TABLE SMALLPROJECT (
NAMEPROJECT VARCHAR2 (100) REFERENCES PROJECT (NAME) ON DELETE CASCADE
ON UPDATE CASCADE,
NAME VARCHAR2 (20) PRIMARY KEY,
DATEDBT DATE,
STATE VARCHAR2 (20) PRIMARY KEY
);
根据和的答案
,它应该在执行任何查询之前配置数据库连接。我有这个问题,因为我没有强制外键约束
public static final String DB_URL = "jdbc:sqlite:database.db";
public static final String DRIVER = "org.sqlite.JDBC";
public static Connection getConnection() throws ClassNotFoundException {
Class.forName(DRIVER);
Connection connection = null;
try {
SQLiteConfig config = new SQLiteConfig(); //I add this configuration
config.enforceForeignKeys(true);
connection = DriverManager.getConnection(DB_URL,config.toProperties());
} catch (SQLException ex) {}
return connection;
}
您能否共享表的定义(不仅仅是列列表,还有用于创建它们的实际DDL)?@Mureinik,我共享了用于创建它们的实际DDL。当您建立与SQLite数据库的JDBC连接时,是否显式启用外键,通过执行
PRAGMA foreign_keys=ON
或使用SQLiteConfig
object?@MenaiAlaEddine,这些DDL会产生多个错误。你确定这些是你的DDL吗?@GordThompson我使用了SQLiteConfig对象,它工作得很好,谢谢。