Как удалить объект из базы данных, когда на него больше нет ссылок в jdo?(отношения n: 1) - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть класс «Персонаж» и класс «Фракция». У персонажа есть фракция. Фракция может быть использована многими персонажами. Фракции сохраняются, когда персонаж сохраняется. Когда больше нет символов, ссылающихся на фракцию, я хочу удалить ее из базы данных.

Когда у меня были отношения 1: 1, это было легко, потому что я мог просто использовать

@Persistent(dependent = "true")

чтобы удалить его, когда он больше не нужен. Но это больше невозможно, потому что теперь может быть другой персонаж, все еще нуждающийся во фракции. Поэтому, если я попытаюсь удалить персонаж1 и он использует ту же фракцию, что и персонаж2, я получу следующее исключение:

java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'FACTION' caused a violation of foreign key constraint 'CHARACTER_FK1' for key (1).  The statement has been rolled back.

Я ТОЛЬКО хочу, чтобы фракция была удалена, когда она больше не нужна. Как я могу это сделать?

1 Ответ

1 голос
/ 17 декабря 2010

Похоже, что лучшим решением будет сама база данных, а не Java.Вы хотите установить триггер ON DELETE для Character, который будет принимать текущую запись (удаляемую), искать ее фракцию, а затем проверять таблицу Character на наличие других записей, ссылающихся на ту же фракцию.Если существуют другие записи, ссылающиеся на эту фракцию, ничего не делать.Если другие записи, ссылающиеся на эту фракцию, не существуют, удалите фракцию.

Если вы не можете сделать это на сервере базы данных, вы можете легко сделать то же самое, что и выше в коде.Преимущество его размещения непосредственно в базе данных состоит в том, что у вас есть правило, определенное в одном месте, где оно будет всегда применяться независимо от того, сколько у вас промежуточных уровней кода между вашими пользователями и данными.

...