Как проверить, связан ли какой-либо объект со строкой в ​​таблице с ограничением внешнего ключа - PullRequest
2 голосов
/ 08 августа 2010

Я использую Hibernate и MySql.

У меня есть 2 таблицы:

User: id, name, type
City: id, name, type
type: id, name

Где user.type имеет внешний ключ для user_type.id.а также city.

Я бы хотел перед удалением строки в таблице user_type проверить, связана ли с ней какая-либо строка из какой-либо таблицы.

сопоставлены мои столбцы, например:

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "type_id")

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Вы сказали

У меня около 100 таблиц , таких как Пользователь и Город, сопоставленные с этим значением

ки. Hibernate с книгой JPA говорит

Возможно, вы удалили все другие ссылки вручную

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

try {
    userType = (Type) session.load(Type.class, id);

    session.delete(userType);
/**
  * or JDBCException 
  * e.getCause()
  * e.getErrorCode() - vendor-specific
  */
} catch (HibernateException e) {
    // checkout Exception right here e.getCause();
} 

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

0 голосов
/ 08 августа 2010

используйте собственный SQL вместе с Hibernate:

  boolean canDeleteType(ind type_id){
         Session s = HibernateUtil.getSessionFactory(); 
         s.beginTransaction();
         Query q = s.createQuery("SELECT User.type_id From User");
         List l = q.list();

    if(l.contains(type_id){
   return false;
}
return false;

}

и тоже самое для таблицы City.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...