Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hibernate:constraintName adalah null di MySQL

Saya telah menemukan solusi berikut:

  1. Perluas Hibernate MySQL5Dialect yang ada:

    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. Tentukan dialek yang baru dibuat dalam file konfigurasi Hibernate (hibernate.cfg.xml):

    <property name="dialect">your.package.MySQL5Dialect</property>
    
  3. Sekarang getConstraintName() akan mengembalikan nama kendala yang dilanggar sebenarnya:

    try {
        ...
    } catch (ConstraintViolationException e) {
        LOG.error(String.format("Constraint=%s, code=%d", e.getConstraintName(), e.getErrorCode()));
    }
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menambahkan kunci unik ke tabel yang ada (dengan baris yang tidak unik)

  2. Memisahkan Datetime menjadi tanggal dan nilai waktu

  3. Peringkat padat MySQL untuk setiap grup/partisi

  4. Akses ditolak untuk 'pengguna'@'localhost'

  5. Cara Memperbarui Banyak Kolom di MySQL