hibernate 并沒(méi)有創(chuàng)建foreign key 而是單純做了索引

hibernate 配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Course.hbm.xml -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cc.sirius.bean">        
    <class name="Person">
        <id name="id" column="personId">
            <generator class="native"/>
        </id>
        
        <set name="addresses" table="PersonAddress">
            <key column="personId"/>
            <many-to-many column="addressId"
                class="Address"/>
        </set>
    </class>
    
</hibernate-mapping>


<?xml version="1.0" encoding="UTF-8"?>
<!-- Course.hbm.xml -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cc.sirius.bean">        
<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <set name="people" inverse="true" table="PersonAddress">
        <key column="addressId"/>
        <many-to-many column="personId"
            class="Person"/>
    </set>
</class
>
    
</hibernate-mapping>

運(yùn)行后查看表:

mysql> show create table PersonAddress;
+---------------+----------------------------------
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
| Table         | Create Table

+---------------+----------------------------------
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
| PersonAddress | CREATE TABLE `personaddress` (
  `addressId` int(11) NOT NULL,
  `personId` bigint(20) NOT NULL,
  PRIMARY KEY (`personId`,`addressId`),
  KEY `FKA81B4EBF34EDEFEE` (`personId`),
  KEY `FKA81B4EBF4E1D97BA` (`addressId`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+---------------+----------------------------------
---------------------------------------------------

經(jīng)過(guò)一天多的反復(fù)研究,發(fā)現(xiàn)是ENGINE=MyISAM的問(wèn)題。

原因:

關(guān)聯(lián)的兩個(gè)表中,一個(gè)或者兩個(gè)表是MyISAM引擎的表。若想要使用外鍵約束,表必須是InnoDB引擎(實(shí)際上,如果兩個(gè)表都是MyISAM 引擎的,這個(gè)錯(cuò)誤根本不會(huì)發(fā)生,但也不會(huì)產(chǎn)生外鍵,只會(huì)建立索引)你需要檢查表的引擎類(lèi)型。

具體的幾種不能生成外鍵的原因可以看一下:http://blog.csdn.net/wangpeng047/article/details/19624351

查看數(shù)據(jù)庫(kù)默認(rèn)的引擎:

--查看當(dāng)前數(shù)據(jù)庫(kù)支持的引擎列表
show engines;

--查看當(dāng)前的默認(rèn)引擎
show variables like '%storage_engine%';

--修改表引擎,這里不需要用到
alter table table_name engine=innodb;  
image.png

這里手動(dòng)修改是不現(xiàn)實(shí)的,配置hibernate.cfg.xml

<!-- 方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>     

這里mysql5.0以上是org.hibernate.dialect.MySQL5InnoDBDialect,以下就去掉5

然后刪庫(kù),重新自動(dòng)生成:

---------------------------------------------------------------+
| personaddress | CREATE TABLE `personaddress` (
  `addressId` int(11) NOT NULL,
  `personId` bigint(20) NOT NULL,
  PRIMARY KEY (`personId`,`addressId`),
  KEY `FKA81B4EBF34EDEFEE` (`personId`),
  KEY `FKA81B4EBF4E1D97BA` (`addressId`),
  CONSTRAINT `FKA81B4EBF34EDEFEE` FOREIGN KEY (`personId`) REFERENCES `person` (
`personId`),
  CONSTRAINT `FKA81B4EBF4E1D97BA` FOREIGN KEY (`addressId`) REFERENCES `address`
 (`addressId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+---------------------------------------------------------------

完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容