org.hibernate.AnnotationException:无法创建唯一键约束

时间:2014-08-07 12:51:05

标签: java hibernate jpa unique-constraint

我使用的是hibernate 4.3.5.Final版本。

为了处理数据库中的保留字,我在hibernate中使用了一个属性 hibernate.globally_quoted_identifiers = true。

我的pojo类有一个独特的列,看起来像

@Entity
@Table(name="theme1"
,catalog="theme2"
, uniqueConstraints = @UniqueConstraint(columnNames={"name1"}) 
public class Theme1  implements java.io.Serializable {

 @Id @GeneratedValue(strategy=IDENTITY)
 private Integer id;

 @Column(name="name1", unique=true, nullable=false, length=32)
 private String name1;

 .....

然后当我的SessionFactoryBean加载时,它失败并出现以下错误

Caused by: org.hibernate.AnnotationException: Unable to create unique key constraint   (name1) on table theme1: database column 'name1' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types)
at org.hibernate.cfg.Configuration.buildUniqueKeyFromColumnNames(Configuration.java:1682)
at org.hibernate.cfg.Configuration.buildUniqueKeyFromColumnNames(Configuration.java:1614)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1450)

在调试过程中,我发现问题是因为我添加的属性(hibernate.globally_quoted_identifiers)。 添加此属性时,Hibernate会附加单引号来处理保留字。但是当从PhysicalToLogical映射时,它无法使用name1.Hence映射'name1'。我遇到了上述错误。

任何人都可以建议如何处理上述两种情况(保留字+ UniqueConstraint)。

1 个答案:

答案 0 :(得分:1)

当设置了hibernate.globally_quoted_identifiers时,Hibernate需要精确的列名。 有关详细信息,请查看JPA with Hibernate 3.6.8.Final, PostgresSQL 9.1, SQLGrammarException - configuration issue? Weird SQL statement。 因此,根据这一点,需要引用pojo类中的列名和表名。