Hibernate ConstraintViolationException getConstraintName

时间:2011-04-14 10:21:30

标签: hibernate

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());
} 

我在log中得到这些 - 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 Hibernate版本:3.6

2 个答案:

答案 0 :(得分:2)

javadoc说:

  

返回违规的名称   约束,如果已知。

Returns:
    The name of the violated constraint, or null if not known.

所以我猜MySQL驱动程序不会在它生成的SQLException中访问违反的约束名,或者Hibernate不知道如何从SQLException中获取它。

使用调试器查看SQLException的详细信息,看看是否可以从某个地方提取它。如果可以,则尝试扩展方言以提取约束名称。

答案 1 :(得分:0)

请看看我回答几乎相同的问题:Hibernate: constraintName is null in MySQL

希望这有帮助,Alex。