2015-09-28 3 views
0

Я знаю, как создать базовый пользовательский проверяемое исключение, но я хочу, чтобы иметь возможность создать исключение, которое проверяет следующее:Создание выборочного исключения SQL в java?

  1. я в основном имеют несколько таблиц в БД, в этой БД у меня есть таблица сообщение с сообщением 2 очереди и очередью. Я могу только ввести сообщение с номером очереди, если этот номер очереди существует в таблице queue_table (т.е. концепция внешнего ключа). Я хочу иметь возможность проверить, что если человек возвращает самое верхнее сообщение из очереди (в сообщении таблицы) (т. Е. Возвращает самую верхнюю строку с определенным номером очереди), существует номер очереди в таблице queue_table. Если он не хочет, чтобы он вызывал исключение QueueDoesNotExistException. Без исключения запрос на получение сообщений из несуществующей очереди в queue_table дает мне null, поэтому я не уверен, что существующее исключение будет полезно.

Так у меня есть следующие:

package asl.exceptions; 

public class QueueDoesNotExistException extends Exception { 
    public QueueDoesNotExistException(){ 



    } 
} 

Я не знаю, как справиться с этим, я вмятина найти какие-либо ресурсы для этого, или я смотрю в неправильном месте?

Я прочитал это: https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlexception.html

Но впадина считают полезным.

+0

Вы пытаетесь выполнить работу на прикладном уровне, который должен быть выполнен в базе данных. Вы не хотите «концепции внешнего ключа *», а скорее являются подлинным внешним ключом. С подходящим ограничением на месте и обеспечиваемым базой данных, прикладному уровню не потребуется выполнять тест, такой как вы вообще описываете. –

+0

Как предлагает Джон, комбинация ограничений «NOT NULL» и «FOREIGN KEY» против столбца будет достаточной для предотвращения повреждения данных. –

+0

@john Я понимаю, что вы говорите, но я не знаю, как это сделать, вы видите, что у меня есть ограничение внешнего ключа, но это не мешает запросу. Например, если у вас есть серия строк и я запрашиваю первое сообщение в очереди 12, но очередь 12 еще не существует, как бы устранить это ограничение NULL/external key? – LoveMeow

ответ

0

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

+0

Как я уже сказал, он не бросает исключение sql, он просто дает мне null, вы могли бы предложить, как бы я это сделал с помощью вашего метода? – LoveMeow

+0

выберите * из таблицы, где ключ = несуществующий ключ является совершенно допустимым. трудно заставить его выбросить исключение. вам нужно сделать запрос, используя процедуру, которая может генерировать исключение, которое вам нужно. но, опять же - это плохой дизайн. Я только пытаюсь достичь вашей идеи о том, чтобы исключить исключение из БД. – ilj

+0

моя главная цель - предупредить пользователя/исключение исключения для операции, которая не является правильной в этой системе, я не уверен, как это сделать – LoveMeow

0

Вы никогда не должны позволить потоку добраться до точки, когда клиент пытается получить доступ к сообщению из несуществующей очереди. Вы проверяете наличие очереди в первую очередь в рабочем процессе и прерываете рабочий процесс с исключением, не делая второго запроса для сообщений в очереди.

+0

Не могли бы вы рассказать? – LoveMeow

+0

Как насчет того, существует ли очередь при выполнении проверки, но тогда нет, когда вы пытаетесь прочитать сообщение? – tddmonkey

+0

Я не знаю, что вы сейчас говорите! Но я не понимаю, как это сделать, используя ограничение внешнего ключа, что wudnt генерирует исключение, когда кто-то запрашивает таблицу сообщений – LoveMeow

0

Основываясь на комментариях, кажется, вы пытаетесь проверить сам запрос, в отличие от того, что он не может вернуть недопустимые данные. По-видимому, вы также хотите различать запрос, который возвращает нулевые строки из-за того, что указанная очередь не записывается в БД, и запрос, который возвращает нулевые строки, потому что в этой очереди нет сообщений, доступных в этой очереди. Я сомневался в полезности этих занятий, но если вы настаиваете, то здесь подход можно взять с собой:

  1. Убедитесь, что ваш Connection не в автофиксации режима (connection.setAutoCommit(false))
  2. Попытки выбрать указанную очередь от queue_table по ее идентификатору. Если это не удается, отмените транзакцию соединения и выбросьте исключение по вашему выбору.
  3. В противном случае выполните основной запрос, как обычно, и если он не выбрасывает, совершите транзакцию.
  4. Следите за тем, чтобы запрос возвращал нулевые строки и, однако, обрабатывал ситуацию.
  5. Если вы полагаетесь на изменение режима автообнаружения как часть процедуры, обязательно запишите и восстановите исходный режим автосохранения, в том числе в случае исключения.

Приносим извинения, если это кажется простым или неважным, или что-то еще.

Смежные вопросы