sql >> データベース >  >> RDS >> Mysql

Hibernate:MySQLではconstraintNameがnullです

    私は次の解決策を考え出しました:

    1. 既存のHibernateMySQL5Dialectを拡張します:

      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. HTMLエコー内の変数で二重引用符をエスケープする

    2. MySQLdb接続の問題

    3. MySQLの単一引用符、二重引用符、逆引用符の使用法の説明

    4. ポート5432でPostgresqlに接続できません