hibernate4.x自動建表時候創建外鍵失敗ERROR: HHH000389: Unsuccessful: alter table ORDERS_NOPK1 add index

1 錯誤描述:

場景:hibernate 自動建立非主鍵多對一關聯時候

ERROR: HHH000389: Unsuccessful: alter table ORDERS_NOPK1 add index FK_590egrftni5wpw63w6fcc1atx (CUSTOMER_ID), add constraint FK_590egrftni5wpw63w6fcc1atx foreign key (CUSTOMER_ID) references CUSTOMERS_NOPK1 (cy_id)
ERROR: Cannot add foreign key constraint

Customer.java

package cn.com.pojo.n21.both.notPK;

import java.util.HashSet;
import java.util.Set;

public class Customer {

    private Integer id;
    // 外鍵對應列
    private Integer cyId;
    private String customerName;
    private Set<Order> orders = new HashSet<>();
    public Customer() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
    public Set<Order> getOrders() {
        return orders;
    }
    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }
    public Integer getCyId() {
        return cyId;
    }
    public void setCyId(Integer cyId) {
        this.cyId = cyId;
    }
    @Override
    public String toString() {
        return "Customer [id=" + id + ", cyId=" + cyId + ", customerName="
                + customerName + ", orders=" + orders + "]";
    }
}

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-9-17 15:48:32 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="cn.com.pojo.n21.both.notPK">
    <class name="Customer" table="CUSTOMERS_NOPK1">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="customerName" type="java.lang.String">
            <column name="CUSTOMER_NAME" />
        </property>

        <property name="cyId" type="java.lang.Integer">
            <!--正確的:<column name="cy_id" not-null="true" unique="true"/> -->
            <column name="cy_id"/>  <!--報錯代碼 -->
        </property>

        <!-- 映射 1 對多 集合屬性 -->
        <set name="orders" table="ORDERS"  cascade="delete" inverse="true">
            <!-- key: 指定多端表中的外鍵列名字 -->
            <key column="CUSTOMER_ID" property-ref="cyId"></key>
            <!-- class指定映射java類 -->
            <one-to-many class="Order"/>
        </set>
    </class>
</hibernate-mapping>

Order.java

package cn.com.pojo.n21.both.notPK;

public class Order {

    private Integer orderId;
    private String orderName;

    private Customer customer;

    public Order() {
        super();
        // TODO Auto-generated constructor stub
    }



    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", orderName=" + orderName
                +  "]";
    }


    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}

Order.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-9-17 15:48:32 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="cn.com.pojo.n21.both.notPK">
    <class name="Order" table="ORDERS_NOPK1">

        <id name="orderId" type="java.lang.Integer">
            <column name="ORDER_ID" />
            <generator class="native" />
        </id>

        <property name="orderName" type="java.lang.String">
            <column name="ORDER_NAME" />
        </property>
          <!-- 在多端設置外鍵 -->
         <many-to-one name="customer" class="Customer" property-ref="cyId">
            <column name="CUSTOMER_ID"/>  
         </many-to-one>

    </class>
</hibernate-mapping>

2 分析原因:

原因可能出現在外鍵與其對應字段不符合上面
2.1來源於網絡:
(1)外鍵對應的字段數據類型不一致
排除: show create table table_name

(2)兩張表的存儲引擎不一致
排除: show table status from db_name where name=’table_name’;
這裏寫圖片描述

(3)設置外鍵時“刪除時”設置爲“SET NULL”
排除:
這裏寫圖片描述

2.2補充:以上原因在這種情況下不太可能出現,因爲都是hibernate自動建表,此時可能是下面原因
(4)外鍵對應字段必須設置 非空並且唯一

3 解決問題:

發現外鍵對應列沒有設置非空或者唯一約束,應該加上約束條件

<property name="cyId" type="java.lang.Integer">
   <column name="cy_id" not-null="true" unique="true"/>
</property>

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章