Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法创建唯一键约束_Java_Hibernate - Fatal编程技术网

Java 无法创建唯一键约束

Java 无法创建唯一键约束,java,hibernate,Java,Hibernate,我正在创建一个简单的实体,并尝试将其持久化到Oracle数据库。这是我的优点: import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @Entity @T

我正在创建一个简单的实体,并尝试将其持久化到Oracle数据库。这是我的优点:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name = "TBL_FLIGHT", uniqueConstraints = @UniqueConstraint(name = "flight_number", columnNames = {
        "comp_prefix", "flight_number" }))
public class Flight implements Serializable {
    @Id 
    private Long id;
    private String companyPrefix;
    private String number;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setCompanyPrefix(String companyPrefix) {
        this.companyPrefix = companyPrefix;
    }

    public void setNumber(String number) {
        this.number = number;
    }   

    @Column(name = "comp_prefix")
    public String getCompanyPrefix() {
        return companyPrefix;
    }

    @Column(name = "flight_number")
    public String getNumber() {
        return number;
    }
}
下面是我的Java类,它创建此实体的一个实例,并使用Hibernate将其保存到数据库:

public class AppTest{

    public static void main(String[] args) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Flight flight = new Flight();
        flight.setCompanyPrefix("prefix");;
        flight.setNumber("100");
        flight.setId(1L);
        session.save(flight);

        session.getTransaction().commit();          

        HibernateUtil.getSessionFactory().close();
    }
}
当我运行此程序时,我得到一个异常,如下所示:

Caused by: org.hibernate.AnnotationException: Unable to create unique key constraint (comp_prefix, flight_number) on table TBL_FLIGHT: database column 'comp_prefix', 'flight_number' 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)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
请帮助我在代码中犯错误的地方。我正在使用
Hibernate-4.3.6

更新:这是我的hibernate配置文件,该表由hibernate本身生成:


oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:XE
我的用户
我的密码
org.hibernate.dialen.oracle10galent
1.
线
org.hibernate.cache.internal.NoCacheProvider
真的
更新


另外,如果可能,请为Hibernate-4.3推荐一个好的资源,因为对于像我这样的初学者来说,不是一个好的资源。

完整的错误文本是:

原因:org.hibernate.AnnotationException:无法在表TBL_航班上创建唯一键约束(comp_前缀、航班号):未找到数据库列“comp_前缀”、“航班号”。确保使用正确的列名,这取决于使用的命名策略(它可能与实体中的属性名不同,尤其是对于关系类型)


您很可能拼错了其中一个列名。

您正在使用字段访问策略(由@Id annotation确定)。将任何与JPA相关的注释放在每个字段的正上方,而不是getter属性

作为JPA提供者,Hibernate可以内省这两个实体属性 (实例字段)或访问器(实例属性)。默认情况下, @Id注释的位置提供了默认的访问策略。 当放置在字段上时,Hibernate将采用基于字段的访问。 放置在标识符getter上,Hibernate将使用基于属性的 通路


当我试图在类a上的列“a_id”和“b_id”上创建唯一约束时,问题出现了,我没有用@manytone注释b,因此Hibernate对列“b_id”(作为类b的外键)一无所知:


我也有同样的错误,通过显式设置
@Column(name=“field\u name”)

对于
@UniqueConstraint

中使用的属性,您可以发布表的DDL吗?@Teh,我已将hibernate配置为在运行程序时为我生成表,我已将hibernate.cfg.xml文件添加到我的帖子中,请检查。尽管列名注释相同。谢谢Bohemian,我已经用hibernate配置文件更新了我的帖子。该表由hibernate自身生成,并且根据我的实体,我使用了正确的列名。在字段级别而不是方法级别添加@column注释解决了这个问题。我按照hibernate在线文档编写了这个简单的程序。文档似乎不完整或有一些bug,您能建议如何学习hibernate-4.3吗?您的解决方案听起来很有用-将其作为一个答案发布,以便其他人可以受益(回答您自己的问题很好)。至于学习,我会从谷歌开始,但没有什么能超越经验——只要尽可能多地使用它。
<session-factory>

    <!-- Database connection settings -->
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
    <property name="hibernate.connection.username">myuser</property>
    <property name="hibernate.connection.password">mypasswd</property>
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>

    <mapping class="org.hibernate.tutorial.Flight" />
</session-factory>
   @Entity
   @Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "a_id", "b_id" }) })
   Class A {
      @Id
      a_id;

      // @ManyToOne was not annotated
      B b;
   }

   @Entity
   Class B {
      @Id
      b_id
   }