2017-09-23 28 views
-1

我在SQlite數據庫的javaFx項目中使用JDBC。我有兩個表"PROJECT""SMAllPROJECT"比如PROJECT有這個結構PROJECT(name,date,state)SMAllPROJECT有這個結構SMAllPROJECT(name,date,state,*project_name*)Project_name被引用自namePROJECT table如何從父表中刪除行有一個引用列到子表?

我試圖從PROJECT刪除行,SMAllPoject中引用的行應該刪除。在sqlite studio中,我配置了onCascade方法,當我應用從父表中刪除一行時,每一件事情都很好,當我在SQlite studio中測試它時,但在我的代碼中,它只是從父表中刪除行。

這是我的代碼:

控制方法

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(); 

     } 

    } 

DAO模式方法

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 

    ); 
+0

你可以分享表的定義嗎(不只是列列表,但實際用於創建它們的DDLs)? – Mureinik

+0

如果你編輯你的問題,請不要扔掉其他用戶爲改善你的問題所做的編輯工作。我回滾了最後一次編輯,因爲它使問題處於更糟的狀態。請注意,英文中的單詞「I」總是大寫,並在句子之間添加一個空格。 –

+0

@Mureinik,我分享了用於創建它們的實際DDL。 –

回答

1

根據SQLite Foreign Key SupportHow do you enforce foreign key constraints in SQLite through Java? 的回答,它應該在執行任何查詢之前配置數據庫連接。我有這個問題,因爲我沒有強制執行外鍵約束。

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; 
} 
相關問題