hibernate 外键
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate 外键内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate 外键相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate 外键相关知识
-
关于Hibernate的oracle主键id生成策略uuid、native和sequence 1.uuid是产生一个32位的字符串,所以在数据库主键字段的大小上必须要大于等于32位。另外如果之前在库表设置了触发器和sequence,那么即使是采用uuid主键生成策略,那么hibernate在做插入时,uuid将会失效,而是采用sequence中的值作为主键id。相当于先用uuid做主键id,但是在插入之前又被sequence中的值覆盖掉了。这点必须注意。删除掉该表的触发器即可恢复。 2.native 意味着主键生成机制的实现方式将交给hibernate决定。hibernate 将根据底层数据库适配器dialect 的定义,采用不同数据库特定的主键生成方式。(对于SQLServer和MySQL自动采用自增字段,对于oracle自动采用Sequence生成主键) 注意:在这种情形下,hibernate会默认使用名为hibernate_sequence的序列,如果oracle中没有设置,Console控制台将会产生“Hib
-
HibernateORM概念O:Object 对象R:Relation 关系 (关系型数据库)外键就是关系M:Mapping 映射关系型数据库,对应的有对象型数据库,比较少用。现在主流的是关系型数据库。MYSQL, Oracle...等都是关系型数据库。ORM解决什么问题?存储:能把对象的数据直接保存到数据库获取:能直接从数据库拿到一个对象要做到上面2点,必须要有映射。图片.pngHibernate和ORM的关系是什么?Hibernate实现了 ORM。ORM相当于是一种思想。比较好的hibernate博文:http://blog.csdn.net/jiuqiyuliang/article/details/39078749图片.png1.Hibernate 案例搭建一个Hibernate环境,开发步骤:1)下载源码:版本:hibernate-distribution-3.6.0.Final2)引入jar文件hibernate3.jar核心 + required 必须引入的(6个)+ jpa + 数据库
-
Hibernate【映射】知识要点(3)在Hibernate入门篇讲解配置的时候,在generator节点下还有一个属性没有讲解,也就是foreign属性...现在来填坑了.. idCard映射文件 idCart的映射文件主要在于:将主键也映射成外键来使用,这就需要用到foreign属性值了 使用<one-to-one>标签来配置基于主键的映射 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="zhongfucheng.on
-
Hibernate【与Spring整合】前言 前面已经学习了如何使用Spring与Struts2进行整合,本博文主要讲解如何使用Spring对Hibernate进行整合 Spring和Hibernate整合的关键点: SessionFactory对象交给Spring来创建 Hibernate的事务交给Spring进行管理 Spring和Hibernate整合步骤 引入jar包 连接池/数据库驱动包 Hibernate相关jar Spring 核心包(5个) Spring aop 包(4个) spring-orm-3.2.5.RELEASE.jar 【spring对hibernate的支持】 spring-tx-3.2.5.RELEASE.jar 【事务相关】 配置文件 hibernate.cfg.xml bea
hibernate 外键相关课程
hibernate 外键相关教程
- 2.2 什么是弱外键 在 join 一节中,我们提到外键的最终落脚点是使用 Join 来连接数据,不过 SQL 连接并非只支持强外键,它其实也支持弱外键,甚至无外键,只要连接的字段能够对应上,连接都是可行的。那么什么是弱外键了?答案其实很简单,强外键是数据库层面上的外键,而弱外键是逻辑层面的上的外键。如下,我们新建两表:CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(20), age int);CREATE TABLE imooc_user_score( id int PRIMARY KEY, user_id int NOT NULL, score int);在新建 imooc_user_score 表的 SQL 语句中,我们并未声明 user_id 是外键,但是在逻辑层面上我们认为它就是外键,在连接的时候知道其对应关系就行了。
- 2.1 强外键的缺点 在外键一节中,我们介绍到外键可以通过如下的方式来创建:FOREIGN KEY (user_id) REFERENCES imooc_user(id)通过声明方式,数据库会自主将两张表做外键关联,我们把这样的外键称为强外键。强外键最大的特点就是数据库层面支持,数据库会自动维护外键关联的表。但是也正是因为这个特性,强外键不够灵活,举个例子来说,当你删除某张表的数据时,如果另一张表有此表的外键,那么删除可能会被拒绝,当然你可以通过级联来同时删除另一张表中关联的数据。如下,我们新建两张存在外键关联的表:DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(20), age int);DROP TABLE IF EXISTS imooc_user_score;CREATE TABLE imooc_user_score( id int PRIMARY KEY, user_id int NOT NULL, score int, FOREIGN KEY (user_id) REFERENCES imooc_user(id));INSERT INTO imooc_user(id,username,age) VALUES (1,'pedro',23);INSERT INTO imooc_user_score(id,user_id,score) VALUES (1,1,9);创建成功后,我们通过 Delete 来删除用户 pedro:DELETE FROM imooc_user WHERE id = 1; 数据库提示我们删除失败,并给出了如下错误信息:(1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`imooc`.`imooc_user_score`, CONSTRAINT `imooc_user_score_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `imooc_user` (`id`))')数据库告诉我们 id 是 imooc_user_score 表的外键,如果删除会破坏数据的完整性,因此拒绝了我们的操作。我们改造一下外键约束,让它支持级联删除:ALTER TABLE imooc_user_score DROP FOREIGN KEY imooc_user_score_ibfk_1;ALTER TABLE imooc_user_score ADD CONSTRAINT imooc_user_score_ibfk_1 FOREIGN KEY(user_id) REFERENCES imooc_user(id) ON DELETE CASCADE;我们再次删除 pedro:DELETE FROM imooc_user WHERE id = 1; 这次删除成功,且 imooc_user_score 中的关联数据也被删除了。强外键虽然能够保证数据的完整性(要么都有,要么都没有),但是弊端很明显,删除了一些数据后,与之关联的数据也都被删除了,不利于数据的维护,也不利于更改和迁移;再者,强外键会因为关联来同步检测和更新两张表,无疑会拉低数据库整体的性能。因此目前大家普遍采用弱外键的方式。
- 2.1 主键生成器 主键是关系数据库中的概念,目的是唯一标识表中记录,保证实体数据的完整性。关系数据库中表与表中数据的关系描述需依赖主键实现 ;另有外键概念,所谓外键是在另一张表中对引用表的主键值的引用称呼。主外键关系指在不同的表中通过共同的字段信息建立起表中数据依赖(引用)关系。回到 Hibernate 的世界!先展示一段代码:Student student = new Student(2, "Configuration老二", "男");session.save(student);上面的代码功能:把应用程序中的数据写入到数据库中,没毛病呀!来!没毛病找点毛病出来:实际操作时,要求 Hibernate 把程序中 stuId 属性的值插入到表中同名的 stuId 主键字段中。主键有什么特点?唯一性!回答得对。请问在应用程序中构建数据时,如何确保赋值给 stuId 的值在表中不存在!这就是问题所在。如何解决?使用 Hibernate 主键生成器。所谓主键生成器其作用就是在 Hibernate 向表中插入数据时,负责生成表中数据记录的主键。Hibernate 主键生成器 API 介绍:Hibernate 的主键生成器(generator)都实现了 org.hibernate.id.IdentityGenerator 接口; public class IdentityGenerator extends AbstractPostInsertGenerator { …… }开发者可以遵循这个接口规范提供自己的主键生成方案;Hibernate 内置有较多主键生成器,主键生成器都有自己的实现类,并提供有快捷名称方便在注解或 XML 中引用。常用主键生成器一览:org.hibernate.id.IncrementGenerator(increment):对 long、short 或 int 的数据列生成自动增长主键;org.hibernate.id.IdentityGenerator(identity): 适用于 SQL server,MySql 等支持自动增长列的数据库,适合 long、short 或 int 数据列类型;org.hibernate.id.SequenceGenerator(sequecne):适用 oracle,DB2 等支持 Sequence 的数据库,适合 long、short 或 int 数据列类型;org.hibernate.id.UUIDGenerator(uuid):对字符串列的数据采用 128 - 位 uuid 算法生成唯一的字符串主键;org.hibernate.id.Assigned(assigned):由应用程序指定,也是默认生成策略。默认使用 assigned 生成器。这种方案要求开发者在应用程序中提供自己的主键生成算法:调用保存方法之前,先带着指定的值往数据库中跑一趟,检索是否存在重复,如果有,再试其它值;调用保存方法之前,先检索到表中 stuId 字段值的最大值,返回应用程序后递增 1,用于 stuId 新值。如果多个用户同时向数据中插入数据,这种方案会出问题,不适合并发操作环境。使用 assigned 生成器除非有一个很完美的解决方案,否则建议只用于学习或测试环境。本课程使用的是 Mysql 数据库,最佳选择 identity 生成器,主键值交给数据库的自动增长列自动生成。
- Django 中 ORM 外键使用 外键 (Foreign Key)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的连接,这个列就成为第二个表的外键。外键的作用如下:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变。外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。在 MySQL 种想使用外键需要具备一定条件的:MySQL 重需要关联的表必须都使用 InnoDB 引擎创建,MyISAM 表暂时不支持外键;外键列必须建立了索引,MySQL 4.1.2 以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如 int 和 tinyint 可以,而 int和char 则不可以。最后我们来了解下在 MySQL 中创建外键的用法,如下:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)REFERENCES tbl_name (index_col_name, ...)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定 CONSTRAINT symbol,MySQL 会自动生成一个名字。其中 ON DELETE、ON UPDATE 表示事件触发限制,可设参数:RESTRICT:限制外表中的外键改动,默认值;CASCADE:跟随外键改动;SET NULL:设空值;SET DEFAULT:设默认值;NO ACTION:无动作,默认的。例如下面的 SQL 语句是由 Django 来帮我们自动生成 nember 和 vip_level 的:CREATE TABLE `member` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `age` varchar(30) NOT NULL, `sex` smallint(6) NOT NULL, `occupation` varchar(30) NOT NULL, `phone_num` varchar(14) NOT NULL, `email` varchar(254) NOT NULL, `city` varchar(30) NOT NULL, `register_date` datetime(6) NOT NULL, `vip_level_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `member_vip_level_id_44ba3146_fk_vip_level_id` (`vip_level_id`), CONSTRAINT `member_vip_level_id_44ba3146_fk_vip_level_id` FOREIGN KEY (`vip_level_id`) REFERENCES `vip_level` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- 2. 主键策略 Hibernate 进行数据库操作时,可依靠主键生成器组件更快速、准确地进行一系列操作。这便是主键策略。
- 4.2 弱外键总结 可以看到,中间表的存在让数据的查询变得更为方便和有效了。当然你也可以选择不要中间表,而在两张主表中各自添加对方外键的方式来达到同样的效果,不过这样的方式显然不推荐。
hibernate 外键相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle