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
答案 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。