java + проект SQLite. Внешний ключ «При обновлении» не обновляется - PullRequest
0 голосов
/ 02 мая 2020

Я делаю приложение javafx (intelliJ с java jdk 11), используя SQLite версии 3.30.1 с DB Browser для SQLite. У меня есть таблица под названием «ульи», и у каждого улья могут быть заболевания (хранятся в таблице «болезни»). это моя таблица "ульев":

CREATE TABLE "beehives" (
"number"    INTEGER NOT NULL,
"id_apiary" INTEGER NOT NULL DEFAULT -2,
"date"  DATE,
"type"  TEXT,
"favorite"  BOOLEAN DEFAULT 'false',
PRIMARY KEY("number","id_apiary"),
FOREIGN KEY("id_apiary") REFERENCES "apiaries"("id") ON DELETE SET NULL
);

это моя таблица "болезней":

CREATE TABLE "diseases" (
"id"    INTEGER NOT NULL,
"id_beehive"    INTEGER NOT NULL,
"id_apiary" INTEGER NOT NULL,
"disease"   TEXT NOT NULL,
"treatment" TEXT NOT NULL,
"start_treat_date"  DATE NOT NULL,
"end_treat_date"    DATE,
PRIMARY KEY("id"),
FOREIGN KEY("id_beehive","id_apiary") REFERENCES "beehives"("number","id_apiary") ON UPDATE CASCADE
);

это моя таблица "пасек", если она вам нужна:

CREATE TABLE "apiaries" (
"id"    INTEGER NOT NULL,
"name"  TEXT NOT NULL,
"address"   TEXT,
PRIMARY KEY("id")
);

Все работает нормально, но когда я обновляю улей (например, когда я обновляю «число», которое является первичным ключом в таблице ульев), болезни не обновляют номер. В результате болезни отсоединяются, поскольку улей правильно меняет свое «число», но болезнь не обновляет его. Там нет сообщения об ошибке. Мой java метод, который вызывает обновление:

    public void updateBeehiveInDB(Beehives newBeehive,Beehives oldBeehive){        

    try {

        s = "UPDATE beehives SET number=?, id_apiary=?, date=?, type=?, favorite=? WHERE number=? and id_apiary=? ";
        preparedStatement = connection.prepareStatement(s);
        preparedStatement.setInt(1, newBeehive.getNumber());
        preparedStatement.setInt(2, newBeehive.getId_apiary());
        preparedStatement.setDate(3, newBeehive.getDate());
        preparedStatement.setString(4, newBeehive.getType());
        preparedStatement.setBoolean(5, newBeehive.isFavorite());
        preparedStatement.setInt(6, oldBeehive.getNumber());
        preparedStatement.setInt(7,oldBeehive.getId_apiary());

        int i = preparedStatement.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

Я пытался проверить, включены ли внешние ключи в соответствии с документацией SQLite здесь , но мой engli sh не хорошо смеяться, и я использую менеджер БД. Поэтому не знаю, как проверить, включено ли это, или как включить его вручную.

Что я могу сделать, чтобы обновить заболевания "id_beehives", когда я обновляю "число" в таблице ульев?

1 Ответ

0 голосов
/ 04 мая 2020

Проблема заключалась в том, что я использую составной внешний ключ, и мне нужно правильно его реализовать в других таблицах, даже если я еще не использовал их в этом новом проекте. Было очень трудно найти проблему, потому что intellij обычно показывает все сообщения об ошибках SQL, но в этом случае ничего не показывалось. Но когда я попытался сделать предложение SQL вручную в браузере БД, там я получил сообщение об ошибке и смог его исправить.

Также пришлось активировать внешний ключ на соединении:

   public Connection openConnection() {

    try {

        String dbPath = "jdbc:sqlite:resources/db/datab.db";
        Class.forName("org.sqlite.JDBC");

        SQLiteConfig config = new SQLiteConfig();
        config.enforceForeignKeys(true);
        connection = DriverManager.getConnection(dbPath,config.toProperties());

        return connection;

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...