【问题标题】:Hibernate Unable to Create Unique Key ConstraintHibernate 无法创建唯一键约束
【发布时间】:2015-09-23 09:51:53
【问题描述】:

我有一个使用 Hibernate 访问数据库的应用程序。它会抛出这样的错误:

org.springframework.beans.factory.BeanCreationException:在 URL [file:/C:/Program%20Files%20(x86)/XXX/applicationContext.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 init方法失败;嵌套异常是 org.hibernate.AnnotationException: Unable to create unique key constraint (column1, column2) on table TABLE: column1, column2 not found 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1482) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:273) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1125) 在 java.awt.event.InvocationEvent.dispatch(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$400(未知来源) 在 java.awt.EventQueue$2.run(未知来源) 在 java.awt.EventQueue$2.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源) 引起:org.hibernate.AnnotationException:无法在表TABLE上创建唯一键约束(column1,column2):column1,column2 not found 在 org.hibernate.cfg.AnnotationConfiguration.buildUniqueKeyFromColumnNames(AnnotationConfiguration.java:616) 在 org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:348) 在 org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1162) 在 org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:720) 在 org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) ... 27 更多

我已经检查了这个问题:org.hibernate.AnnotationException: Unable to create unique key constraintUnable to create unique key constraint 但是他们没有解决我的问题。

有没有办法解决问题?

【问题讨论】:

  • 分享你的 beans 文件,你在 hibernate 中定义表的模式。
  • 查看您的实体 bean 中的列名是否拼写错误

标签: java spring hibernate


【解决方案1】:

确保为@UniqueConstraint 的columnNames 属性使用数据库级别的列名。例如,虽然对于简单类型,数据库级别的列名称可能与实体级别的属性名称相同,但关系属性通常不是这种情况。例如

@Table(name = "persons",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = {"number", "person_type" ,"company_id"})
        })

public abstract class Person extends BaseEntity implements ActorProfile {

    @Column(name = "zpa_number")
    private String zpaNumber;

    @Column(name = "number")
    private Long number;

    @Column(name = "person_type")
    private String personType;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private Company company;
}

【讨论】:

  • 我有一个属性 empId,在我的例子中,它使用属性名称而不是 db 列 (emp_id)。而对于超类中的其他字段,它只接受 db 列名。我现在对这种双重标准的休眠感到困惑
【解决方案2】:

您很可能在该 UniqueKey 的定义中有错字,因为在数据库中找不到约束应该应用的列(我假设它是由 hibernate 构建的)。

请注意,在指定唯一键约束时,您必须使用列名而不是属性名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多