问题描述
||
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。