休眠ConstraintViolationException getConstraintName

问题描述

||
mysql> alter table metakey add constraint Name unique(name);
mysql> desc  metakey;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(45)         | NO   | UNI |         |                |
+-------+---------------------+------+-----+---------+----------------+


@Entity
@Table(name = \"metakey\",uniqueConstraints={@UniqueConstraint(name=\"Name\",columnNames={\"name\"})})
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class MetaKey implements Serializable{
    @Id @Column @GeneratedValue private Long id;
    @Column private String name;
}


sess.save(obj);
 ..
}catch(ConstraintViolationException cve){
  log.error(cve.getMessage());
  log.info(\"Constraint name:\"+cve.getConstraintName());
} 
我在日志中得到这些-cve.getConstraintName()返回null
org.hibernate.util.JDBCExceptionReporter  - SQL Error: 1062,SQLState: 23000
org.hibernate.util.JDBCExceptionReporter  - Duplicate entry \'Unit\' for key \'Name\'

could not insert: [com.comp.MetaKey]
Constraint name:null
有什么办法可以找到约束名称? 伺服器版本:5.1.56 休眠版本:3.6     

解决方法

javadoc说:   返回违规的名称   约束(如果已知)。
Returns:
    The name of the violated constraint,or null if not known.
因此,我猜想MySQL驱动程序无法在其生成的SQLException中授予对违反的约束名称的访问权限,或者Hibernate不知道如何从SQLException中获取它。 使用调试器查看SQLException的详细信息,并查看是否可以从某处提取它。如果可以,请尝试扩展方言以提取约束名称。     ,请让我回答几乎相同的问题:Hibernate:MySQL中的约束名称为null 希望这会有所帮助,Alex。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...