" column="student_id"> hibernate-mapping> 配置文件中的set对应于相应类中的集合...运行代码执行的建表语句为: alter table t_signup drop foreign key FK7DADC3438FFF3382 alter table t_signup drop foreign...table t_signup add index FK7DADC3438CBEF332 (course_id), add constraint FK7DADC3438CBEF332 foreign key...t_signup中生成了复合主键,student_id和course_id分别是指向t_student和t_course的外键。...插入测试 session.beginTransaction(); Course course1=new Course(); course1.setName("《心理应激微反应》"); session.save
int(10), -> name varchar(32) not null -> ); Query OK, 0 rows affected (0.08 sec) 如果没有插入name字段数据...即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录 5、按主键约束的字段数量分类 无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)...单一主键:给一个字段添加主键约束 复合主键:给多个字段联合添加一个主键约束(只能用表级定义) 单一主键(列级定义) mysql> create table t_user( -> id int(...单一外键:给一个字段添加外键约束 复合外键:给多个字段联合添加一个外键约束 4、一张表可以有多个外键字段(与主键不同) 建立两个表,学生表,和班级表 学生表(添加单一外键) sno(pk)...父表——被外键引用的表 子表——引用父表中的健作为外健的表 on delete set null 表的关联列的值设置为null alter table students add constraint
,不允许插入重复的ID,如果不指定主键的值,默认为0。...,会自动在现有主键值的最大值上自动增加1作为新记录的主键,主键值默认从1开始。...index uc_sname; 三、域完整性 1、默认值 在表中插入一条新的记录时,如果没有为该字段赋值,那么数据库系统会自动为该字段赋一条默认值。...,作用是阻止不满足条件的值进入该列,对null值无效,因为插入null就相当于没有插入。...删除成绩表的外键约束 ALTER TABLEscoreDROP FOREIGN KEYscore_fk; 增加成绩表的sid列外键约束,参照动作为set null ALTER TABLEscoreADD
Hibernate会自动根据所注解的对象生成合适的SQL语句,如果Lob注解到了字符串上,Hibernate会生成CLOB类型对象;如果注解到了byte[]数组之类的上面,就会生成BLOB类型的对象。...本来也应该有一个应用ManyToOne注解的article字段来表示评论所属的文章,但是为了演示单向的OneToMany映射,所以我故意不添加这个文章属性。...有的同学可能想到了,多对一注解应用到字段上没有问题。但是一对多注解,如何应用到普通字段上呢。所以,这里需要一个集合。...另外需要注意的是,使用多对多映射时,不能把级联属性指定为CascadeType.DELETE或者CascadeType.ALL,我们应该不希望在删除一篇文章的标签时,同时将该标签下的所有文章都删除吧?...另外Hibernate的多对多映射存在一个问题,就是和单向一对多一样,删除一个关联,需要先删除所有关联,然后将其他的重新插入。
auto_increment, name varchar(255), idCard integer unique, primary key (id)) alter table t_person add index FK785BED80F7C7B4CE...(idCard), add constraint FK785BED80F7C7B4CE foreign key (idCard) references t_idCard (id) 至此,唯一外键关联就已经配好了...: object references an unsaved transient instance” 插入的数据如下: ? ...插入时执行的sql语句: insert into t_idCard (cardNo) values (?) insert into t_person (name, idCard) values (?...> 因为这里配置的实质是一张身份证只对应一位公民,所以用标签,property-ref="idCard"指t_idcard的主键与t_person中的idCard字段对应
,而是字段中提取的特别关键字 关键字:可以是某个字段或多个字段,多个字段称为复合索引 建表:creat table student( stu_id int unsigned not null auto_increment...,假如查询条件不包含索引列最左边部分,即不满足最左原则 leftmost,是不会使用复合索引的。...1、字符串字段权衡区分度与长度的技巧 截取不同长度,测试区分度 # 这里假设截取6个字符长度计算区别度,直到区别度达到0.1,就可以把这个字段的这个长度作为索引了mysql> select count...2、左前缀不易区分的字段索引建立方法 这样的字段,左边有大量重复字符,比如url字段汇总的http:// 1、倒过来存储并建立索引 2、新增伪hash字段 把字符串转化为整型 3、索引覆盖 概念:如果查询的列恰好是索引的一部分...,要选择最常作为访问条件的列作为主键,另外,Innodb 表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效的减少索引的磁盘占用,提高索引的缓存效果。
在hibernate的管理下,当有数据添加进userinfo表的时候,hibernate将拿到该实体类实例的集合属性的值,并连带该实例的id一起插入到新表中。...对于性能的要求,hibernate不推荐实体类属性使用数组类型,建议优先使用集合类型。...组件类的每个属性都被映射到userinfo表中了。当我们通过实体类实例向数据表中插入数据的时候,hibernate会将组件类实例拆分出来的各个属性插入到对应的表字段。...Hibernate选择将集合中的复合类型拆分成多个字段,其他的和普通的集合属性映射并没有太大变化。 ?...只不过对于普通的集合类型映射来说,图中红色框中内容仅仅是一个字段,而对于复合类型,由于数据库中并没有相对应的类型来存储,所以就需要拆分成基本的字段类型。
(1)如果找不到合适的列作为主键,除了用id列,我们一般使用联合主键,即多列的值作为一个主键,从而保证记录的唯一性。...(3)创建一个实体类存放两个主键作为属性,并且实现set和get,并且必须实现可序列化; 之后这个实体类和数据表中非两个主键的字段构成一个新的实体类,并且实现set和get方法, <class...-- 7 第一部分:映射文件:映射一个实体类对象,用来描述一个对象最终实现可以直接保存对象数据到数据库中 8 package(可选):要映射的对象即实体类所在的包,如果不指定package...-- 非主键映射,普通字段的映射 name:字段的属性名称,其他字段可以不写; column:对应的数据表的字段名称; ...length:自定字符类型的长度,只能指定字符类型的,如果不指定,默认为255; type:指定数据表的字段的类型,如果不指定会匹配属性的类型: java
第一部分 主键映射 前言:区分主键的两种方法。 ? ? 但不管是什么主键,它都必须满足以下几个条件: 主键不能为空。 主键不能重复。 主键不能被修改。...8.3 复合主键的映射 复合主键的映射有两种方法:单独定义主键类和不单独定义主键类,下面分别介绍: 8.3.1 单独定义主键类 单独定义主键类,即把主键的属性组成一个新的类,这个类与要映射的POJO类类似...,也要生成它的get和set方法,但是该类并不作为POJO类使用,而是作为映射POJO类的一个主键属性。...第二部分 数据类型映射 在Hibernate的映射文件中,用标签来说明POJO类的属性与数据库表中的哪一个字段对应,用type属性说明对应属性应该使用什么数据类型。...第四部分 动态类的使用 前面的例子都是使用Java代码的POJO类作为对象模型,其实Hibernate还支持在XML文件中直接表示持久化数据类,这样的好处是便于开发人员对程序的维护。 ? ? ? ?
--为没有添加主键的表添加主键,这里是复合主键的例子--> ALTER TABLE student ADD CONSTRAINT pk_studentid PRIMARY KEY (id,name) 的表添加外键,这里是添加多个外键的例子--> ALTER TABLE student ADD CONSTRAINT fk_students FOREIGN KEY (t_id) REFERENCES...--为已经添加“有名字的”外键的表删除外键,这里删除的名为fk_students的外键--> ALTER TABLE student DROP CONSTRAINT fk_students 给表和字段添加注释...null 三、简单的sql语句(增删改查) 1.插入(insert) 向Student表中插入一条数据: 语法:insert into 表名称 values (值1,值2,······) 例子:...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如果自己不设置@Id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。原因可参考上一篇mongo和mysql的性能对比。...在实际业务中不建议自己设置主键,应交给mongo自己生成,自己可以设置一个业务id,如int型字段,用自己设置的业务id来维护相关联的表。...@Document 标注在实体类上,类似于hibernate的entity注解,标明由mongo来维护该表。...(注解怎么写还不清楚,待查) @CompoundIndex 复合索引,加复合索引后通过复合索引字段查询将大大提高速度。...def = "{'lastName': 1, 'age': -1}") }) public class Person { } 写法如上,lastName和age将作为复合索引
(FK) #标识该字段为该表的外键 NOT NULL #标识该字段不能为空 UNIQUE KEY (UK) #标识该字段的值是唯一的 AUTO_INCREMENT ...字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' #必须为正值...,约束的字段必须同时被key约束 (重点)验证: 不指定id,则自动增长 mysql> create table student(id int primary key auto_increment,name...: delete from t1; 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始. truncate table t1;数据量大,删除速度比上一条快,且直接从零开始. foreign key...,就复合我们正常的生活中的情况了 再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除 mysql> delete from dep where id=3; Query OK, 1 row
#如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的 #方式1: alter table 表名称 add unique [key](字段列表); #方式2: alter table...uk_name UNIQUE(NAME); ALTER TABLE USER MODIFY NAME VARCHAR(20) UNIQUE; 复合唯一约束 字段列表中写的是多个字段名,多个字段名用逗号分隔...表示那么是复合唯一,即多个字段的组合是唯一的 不设置约束名则为第一个字段名 create table 表名称( 字段名 数据类型, 字段名 数据类型, 字段名 数据类型, [constraint...constraint fk_dept_did foreign key (deptid) references dept(did) #在从表中指定外键约束 #emp表的deptid和和dept表的did.../某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 多对多的关系 用户和角色 用户: 角色:...,指向各自表的主键 1.2 Hibernate 中的一对多关系映射 1.2.1 Hibernate 的一对多环境搭建 1.2.2 创建表和实体 创建表 CREATE...-- 需要做类的其它属性和表的其它字段映射 --> 的字段名称 --> 的一方对象的属性名 class: 一的一方的全限定名 column:外键字段名称 --> <many-to-one cascade
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。...这个表中字段分别命名为StudentId、CourseID(既是此表的复合主键,同时分别为连接Student表和Course表的外键,等下到主键和外键的命名处再说),这样就实现了学生和课程之间的多对多关系...为了避免这种情况发生,应该明确的规定:所有表示时间的字段,统一以 Date 来作为结尾。...之所以会有这样的思路,是因为Null好啊,程序不容易出错啊,你插入记录的时候如果不小心忘输了一个字段,程序依然可以Run,而不会出现 “XX字段不能为Null”的错误消息。...由于这是我的博客文章表,不应该出现重复的题目,这样可以避免在使用 Insert 语句时插入重复值。类似于Check约束,这里的命名规则是:uq_+ 表名 + 字段名。
insert语句插入数据 语法格式: insert into 表名(字段名1,字段名2,字段名3…)values(值1,值2,值3) 要求:字段的数量和值的数量相同 ,并且数据类型要对应相同 ,...(就像一个人的身份证号码一样) 主键的分类 根据主键字段的字段数量来划分: 单一主键 (推荐的,常用的) 复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式)...(这种方式是推荐的) 业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键(不推荐用)**最好不要拿着和业务挂钩的字段作为主键。...单一索引:给单个字段添加索引 复合索引:给多个字段联合起来添加一个索引 主键索引:主键上会自动添加索引 唯一索引:有unique约束的字段上会自动添加索引 索引什么时候失效 select ename...) tno(fk) 第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 外键: 外键用于关联两个表。 复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引。...如果不设置默认值,则自动设置该字段默认为 NULL。...除了最后一句create_all可以不写(写上也没事,这句是创建表,但是表已经存在的情况下,不会创建也不会报错) 暂时不要用中文,使用中文的方法在最后 插入数据: from sqlalchemy import...插入表的时候,也要写明类型,否则ORM不知道这个字段是数字还是字符串。但是不写大小是可以的 总结,所以创建表的时候对类的要求是最严的。...好吧,以防万一我留50个作者字段名。逻辑通,但是字段设多了浪费,少了不够用。这里的情况主要是字段数量不固定,而且我们甚至不知道字段的上限。
普通字段类型 2. 主键映射 单列主键映射 多列作为主键映射 主键生成策略,查看api: 5.1.2.2.1....数据库存储的数据都是有效的,必须保持唯一。 (为什么把id作为主键?) 因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!...联合/复合主键 如果找不到合适的列作为主键,出来用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。 映射配置 <!...-- 普通字段映射 property name 指定对象的属性名称 column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。...length 指定字符的长度, 默认为255 type 指定映射表的字段的类型,如果不指定会匹配属性的类型 java类型: 必须写全名 hibernate类型: 直接写类型,都是小写 --
最近学习hibernate注解形式配置POJO类,将注解的解析记下来,以备以后使用。 例1....我这里一般交给底层数据库处理,所以调用了名叫generator的增长方式,由下边的@GenericGenerator实现 @GenericGenerator hibernate内部的主键增长方式....(默认值true) (4) insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true) (5) updatable 可选,该列是否作为生成的update...关键字段默认值和一对一关联的情况相似。...但下面这种情况则需要 targetEntity 定义(使用接口作为返回值,而不是常用的实体)。
CHECK 条件约束C 指定该列是否满足某个条件 约束命名规则 如果不指定约束名Oracle server 自动按照SYS_Cn 的格式指定约束名,也可手动指定, 推荐的约束命名是:约束类型...:CHECK 条件约束 何时创建约束: 建表的同时 建表之后 可以在表级或列级定义约束 列级约束:只能引用一个列并且它属于列定义的一部分,可定义成任意类型的完整性约束。...表级约束:可引用一个或多个列,并且它属于表定义的一部分,可定义除NOT NULL外的其它约束。...列级上的约束 建表时约束定义的基本格式: 字段定义constraint 约束名约否类型(字段名)-->unique,primary key,check 字段定义constraint 约否名foreingn...insert语句的影响: 插入数据的外键字段值必须在主表中存在,只有从表才有可能违反约束,主表不会。
领取专属 10元无门槛券
手把手带您无忧上云