Hibernate: constraintName является нулевым в MySQL - PullRequest
2 голосов
/ 22 января 2010

У меня есть код с использованием JPA с Hibernate 3.3.x. Этот код Java можно использовать со схемами, хранящимися в Oracle 10g или MySQL 5.1.x. Таблицы определены с ограничениями для определения уникальных записей. Когда происходит нарушение ограничения, я хочу получить имя ограничения из исключения.

В Oracle имя ограничения извлекается правильно. В MySQL имя ограничения: NULL .

Есть идеи, как получить имя ограничения с MySQL?

Спасибо

Указанный

Ответы [ 3 ]

5 голосов
/ 24 января 2013

Я придумал следующее решение:

  1. Расширение существующего Hibernate MySQL5Dialect:

    public class MySQL5Dialect extends org.hibernate.dialect.MySQL5Dialect {
    
        /**
        * Pattern to extract violated constraint name from {@link SQLException}.
        */
        private static final Pattern PATTERN = Pattern.compile(".*constraint\\W+(\\w+).*", Pattern.CASE_INSENSITIVE);
    
        private ViolatedConstraintNameExtracter constraintNameExtracter;
    
        public MySQL5Dialect() {
            constraintNameExtracter = new ConstraintNameExtractor();
        }
    
        @Override
        public ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() {
            return constraintNameExtracter;
        }
    
        private class ConstraintNameExtractor implements ViolatedConstraintNameExtracter {
    
            @Override
            public String extractConstraintName(SQLException sqle) {
                final String msg = sqle.getMessage();
                final Matcher matcher = PATTERN.matcher(msg);
                String constraintName = null;
                if (matcher.matches()) {
                    constraintName = matcher.group(1);
                }
    
                return constraintName;
            }
    
        }
    
    }
    
  2. Укажите вновь созданный диалект в конфигурационном файле Hibernate (hibernate.cfg.xml):

    <property name="dialect">your.package.MySQL5Dialect</property>
    
  3. Теперь getConstraintName () вернет фактическое имя нарушенного ограничения:

    try {
        ...
    } catch (ConstraintViolationException e) {
        LOG.error(String.format("Constraint=%s, code=%d", e.getConstraintName(), e.getErrorCode()));
    }
    
1 голос
/ 12 декабря 2013

Попробуйте использовать это:

try {
 // ...
} catch (ConstraintViolationException t) {
        if (t.getCause().getLocalizedMessage().contains("your_constraint_name")) {
            // ...
        } 
}
0 голосов
/ 22 января 2010

Указываете ли вы имена ограничений в MySQL на уровне базы данных? в Oracle ограничения получают имена по умолчанию, если они не указаны, однако в MySQL я не знаю, я думаю, что однажды услышал, что если вы не укажете имя для ограничения, MySQL не установит имя по умолчанию !!

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