मैं निम्नलिखित समाधान लेकर आया हूं:
-
मौजूदा हाइबरनेट 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; } } }
-
हाइबरनेट कॉन्फ़िगरेशन फ़ाइल (hibernate.cfg.xml) में नव निर्मित बोली निर्दिष्ट करें:
<property name="dialect">your.package.MySQL5Dialect</property>
-
अब getConstraintName() वास्तविक उल्लंघन किए गए बाधा नाम लौटाएगा:
try { ... } catch (ConstraintViolationException e) { LOG.error(String.format("Constraint=%s, code=%d", e.getConstraintName(), e.getErrorCode())); }