收藏 分享(赏)

尚学堂马士兵hibernate笔记(讲义).doc

上传人:精品资料 文档编号:11017447 上传时间:2020-01-31 格式:DOC 页数:30 大小:715KB
下载 相关 举报
尚学堂马士兵hibernate笔记(讲义).doc_第1页
第1页 / 共30页
尚学堂马士兵hibernate笔记(讲义).doc_第2页
第2页 / 共30页
尚学堂马士兵hibernate笔记(讲义).doc_第3页
第3页 / 共30页
尚学堂马士兵hibernate笔记(讲义).doc_第4页
第4页 / 共30页
尚学堂马士兵hibernate笔记(讲义).doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、知识点终结:1 新建项目2 学习建立 user-library-hibernate,并加入相应的 jar 包a 项目右键-build path-configure build path-add libraryb 选择 user-library,在其中新建 library,命命为 hibernatec 在该 library 中加入 hibernate 所需要的 jar 包hibernate3.3.2 /hibernate3.jar/lib/required 目录下的所有包 6 个Sl4j-nop jar3 引入 mysql 的 JDBC 驱动包4 在 MYSQL 中建数据库和相应的表 stude

2、nt(id,name,age)5 建立 hibernate 配置文件 hibernate.cfg.xml参考文档中 COPY,修改对应的数据库连接,6 建立 student 类7 建立映射文件 Student.hbm.xml 参考相应文档8 将映射文件加到 hibernate-cfg.xml 中搭建日志环境并配置显示 DDL 语句slf 的实现:slf4j nodep ,log4j ,jdk logging api ,apache common-log.slf4j.nop.jar 是 slf-api.jar 其相应的接口实现把 slf 的接口对到 log4j 的实现,在 user librar

3、y 中 hibernate,把 slf 的实现 slf4j-nop-1.5.8.jar 去掉,添加 log4j 的实现 log4j-1.2.15.jar,再添加一个 slf-api 和 log4j 转换器 slf4j-log4j12-1.5.8.jar.把 slf 的接口转换成 log4j 的接口.最后添加一个 log4j 的配置文件 log4j.properties利用 HIBERNATE 导出数据库建表/读取配置文件 hibernate.cfg.xmlConfiguration cfg=new AnnotationConfiguration().configure();(有注解时使用 An

4、notationConfiguration),configure()可以手动指定配置文件名称.Configuration cfg=new Configuration(),会默认读取 hibernate.properties 文件/创建 schemaExport 对象import org.hibernate.tool.hbm2ddl.SchemaExport;SchemaExport export=new SchemaExport(cfg);/创建数据库表export.create(true, true);对象映射(采用 Annotation 注解方式)1 建表Create table teac

5、her(id int primary key,name varchar(20),title varchar(20);2 创建 teacher 类,并进行注解import javax.persistence.Entity;import javax.persistence.Id;在 bean 中加注解 Entity,Id(加在 getId()上面)3 在 hibernate 中加入 annotation 相应的 jar 包hibernate-annotations.jar/lib 目录下加入相应的包 ejb3-persistence.jar, hibernate-commons-annotatio

6、ns.jar注意:annotation 文档中并没有提到 hibernate-annotations.jar 包4 参考 annotation 文档建立对应的注解5 在 hibernate.cfg.xml 中建立映射6 示例/AnnotationConfiguration;Configuration cfg=new AnnotationConfiguration();SessionFactory sf=cfg.configure().buildSessionFactory();Session session=sf.openSession();session.beginTransaction()

7、;session.save(t);/session.getTransaction().commit();session.close();sf.close();对象映射(采用配置文件方式 )1 在相应的类中建立对应的配置文件. 例如 Student 类对应的配置文件 Student.hbm.xml2 在 hibernate.cfg.xml 中添加该映射文件 Student.hbm.xml即可注意包名的写法3 示例/读取配置文件hibernate.cfg.xmlConfiguration cfg=new Configuration().configure();/创建SessionFactorySe

8、ssionFactory sf=cfg.configure().buildSessionFactory();/创建sessionSession session=sf.openSession();session.beginTransaction();session.save(s);session.getTransaction().commit();session.close();sf.close();hibernate.cfg.xml 配置hibernate.hbm2ddl.auto 属性取值: validate | update | create | create-drop在 sessionf

9、actory 创建时,自动检查数据结构,或者将数据库 schema(表)的 DDL 导出到数据库,使用create-drop 时,在显式关闭 sessionfactory 时,将 drop 掉数据库 schema.validate 加载 hibernate 时,验证创建数据库表结构 create 每次加载 hibernate,重新创建数据库表结构 create-drop 加载 hibernate 时创建,退出是删除表结构 update 加载 hibernate 自动更新数据库结构表名和类名不同的情况时,对表名进行配置1 在注解中import javax.persistence.Table;Ta

10、ble(name=”TableName”)2 在 XML 文件中 配置对应的 table 属性为相应的表名字段名和属性名相同,默认为对于 annotation,如果什么注解都不写的话,相当于加了注解Basic实体 bean 中所有的非 static 非 transient 的属性都可以被持久化 , 除非你将其注解为Transient.所有没有定义注解的属性等价于在其上面添加了Basic 注解. 通过 Basic 注解可以声明属性的获取策略(fetch strategy):对于 XML 文件中不用写 column.字段名和属性名不同时Annotation:column(name=”column_

11、name”)加上相应的 getXXX()方法上XML:column 属性不需要 persistence 的字段import javax.persistence.Transient; Transient 意思是说这个属性是透明的 ,不进行持久化,存储的时候不存进去映射日期和时间类型,指定时间精度Annotation: import javax.persistence.Temporal;Temporal(TemporalType.TIME)XML:指定 typetype=time 或 date枚举类型的转换Enumerated(EnumType.STRING)字段映射的位置推荐写在 gexXXX

12、方法上Hibernate 映射类型Hibernate 映射类型 Java 类型 标准 SQL 类型 大小和取值范围 integer 或者 int int 或者 java.lang.Integer INTEGER 4 字节 long long Long BIGINT 8 字节 short short Short SMALLINT 2 字节 byte byte Byte TINYINT 1 字节 float float Float FLOAT 4 字节 double double Double DOUBLE 8 字节 big_decimal java.math.BigDecimal NUMERIC

13、 NUMERIC(8,2)8 位 character char Character String CHAR(1) 定长字符 string String VARCHAR 变长字符串 boolean boolean Boolean BIT 布尔类型 yes_no boolean Boolean CHAR(1) (Y-N) 布尔类型 true_false boolean Boolean CHAR(1) (T-F) 布尔类型 2 、 Java 时间和日期类型的 Hibernate 映射 映射类型 Java 类型 标准 SQL 类型 描述 date util.Date 或者 sql.Date DATE

14、YYYY-MM-DD time Date Time TIME HH:MM:SS timestamp Date Timestamp TIMESTAMP YYYYMMDDHHMMSS calendar calendar TIMESTAMP YYYYMMDDHHMMSS calendar_date calendar DATE YYYY-MM-DD 3 、 Java 大对象类型的 Hibernate 映射类型 映射类型 Java 类型 标准 SQL 类型 MySQL 类型 Oracle 类型 binary byte VARBINARY( 或 BLOB) BLOB BLOB text String CL

15、OB TEXT CLOB serializable Serializable 接口任意实现类 VARBINARY( 或 BLOB) BLOB BLOB clob java.sql.Clob CLOB TEXT CLOB blob java.sql.Blob BLOB BLOB BLOB 在程序中通过 Hibernate 来保存 java.sql.Clob 或者 java.sql.Blob 实例时,必须包含两个步骤: 1 在一个数据库事务中先保存一个空的 Blob 或 Clob 实例。 2 接着锁定这条记录,更新上面保存的 Blob 或 Clob 实例,把二进制数据或文本数据写到 Blob 或

16、Clob 实例中 Hibernate SQL 方言 (hibernate.dialect) RDBMS 方言 DB2 org.hibernate.dialect.DB2DialectDB2 AS/400 org.hibernate.dialect.DB2400DialectDB2 OS390 org.hibernate.dialect.DB2390DialectRDBMS 方言 PostgreSQL org.hibernate.dialect.PostgreSQLDialectMySQL org.hibernate.dialect.MySQLDialectMySQL with InnoDB o

17、rg.hibernate.dialect.MySQLInnoDBDialectMySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialectOracle (any version) org.hibernate.dialect.OracleDialectOracle 9i/10g org.hibernate.dialect.Oracle9DialectSybase org.hibernate.dialect.SybaseDialectSybase Anywhere org.hibernate.dialect.SybaseAnywhereDia

18、lectMicrosoft SQL Server org.hibernate.dialect.SQLServerDialectSAP DB org.hibernate.dialect.SAPDBDialectInformix org.hibernate.dialect.InformixDialectHypersonicSQL org.hibernate.dialect.HSQLDialectIngres org.hibernate.dialect.IngresDialectProgress org.hibernate.dialect.ProgressDialectMckoi SQL org.h

19、ibernate.dialect.MckoiDialectInterbase org.hibernate.dialect.InterbaseDialectPointbase org.hibernate.dialect.PointbaseDialectFrontBase org.hibernate.dialect.FrontbaseDialectFirebird org.hibernate.dialect.FirebirdDialectID 生成策略1.XML 方式配置可选的 子元素是一个 Java 类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数

20、, 用元素来传递。 uid_tablenext_hi_value_column所有的生成器都实现 org.hibernate.id.IdentifierGenerator 接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate 提供了很多内置的实现。下面是一些内置生成器的快捷名字: increment 用于为 long, short 或者 int 类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。 identity 对 DB2,MySQL, MS SQL Server, Sybase 和 Hypersoni

21、cSQL 的内置标识字段提供支持。 返回的标识符是 long, short 或者 int 类型的。 sequence 在 DB2,PostgreSQL, Oracle, SAP DB, McKoi 中使用序列(sequence) , 而在Interbase 中使用生成器 (generator)。返回的标识符是 long, short 或者 int 类型的。 hilo 使用一个高 /低位算法高效的生成 long, short 或者 int 类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和 next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个

22、特定的数据库中是唯一的。 seqhilo 使用一个高 /低位算法来高效的生成 long, short 或者 int 类型的标识符,给定一个数据库序列(sequence)的名字。 uuid 用一个 128-bit 的 UUID 算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了 IP 地址) 。UUID 被编码为一个 32 位 16 进制数字的字符串。 guid 在 MS SQL Server 和 MySQL 中使用数据库生成的 GUID 字符串。 native 根据底层数据库的能力选择 identity, sequence 或者 hilo 中的一个。在 mysql 中默认的是 aut

23、o_increment,SQLSERVER 中是 identity. assigned 让应用程序在 save()之前为对象分配一个标示符。这是 元素没有指定时的默认生成策略。 select 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。 foreign 使用另外一个相关联的对象的标识符。通常和联合起来使用。 sequence-identity 一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3 的 getGeneratedKeys 结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向 JDK 1.4 的 Oracle 10g 驱动支持这一

24、策略。注意,因为 Oracle 驱动程序的一个 bug,这些插入语句的注释被关闭了。(原文:Note comments on these insert statements are disabled due to a bug in the Oracle drivers.) 2 annotation 中配置 id 生成策略使用Id 注解可以将实体 bean 中的某个属性定义为标识符(identifier). 该属性的值可以通过应用自身进行设置, 也可以通过 Hiberante 生成(推荐). 使用 GeneratedValue 注解可以定义该标识符的生成策略: 有四种策略 AUTO -默认值.可

25、以是 identity column 类型,或者 sequence 类型或者 table 类型,取决于不同的底层数据库对于 MYSQL,是 auto_increment,对于 Oracle 是 hibernate-sequence. TABLE - 使用表保存 id 值 (了解) IDENTITY - identity column SEQUENCE - SequenceGeneratorGeneratedValue(strategy=GenerationType.XXXX)XXXX 取值为 Type.SEQUENCE|TABLE|AUTO|IDENTITY 不同的数据库对应着不同的生成策略.

26、例 1实体类注解Entity主键进行注解IdGeneratedValue 默认值是GeneratedValue(strategy=GenerationType.AUTO)例 2使用 SequenceGeneratorEntitySequenceGenerator(name=“teacher_SEQUENCE“,sequenceName=“teacher_SEQUENCE_DB“)name 是用户自定义的 generator 生成器的名字, sequenceName 是生成到数据库后sequence 对象的名字 .在实体中注解好后,就可以在 id 注解上写上对应的IdGeneratedValue

27、(strategy=GenerationType.IDENTITY,generator=“teacher_SEQUENCE“)例 3表生成器(了解),这种方式会另外生成一个表.实体类注解Entityjavax.persistence.TableGenerator(/了解,更适合用于跨平台跨数据库.name=“TEACHER_GEN“, /生成器generator的名字table=“GENERATOR_TABLE“,/生成的表名pkColumnName = “pk_key“,/生成的表的字段名valueColumnName = “pk_value“,/生成的表的字段的值pkColumnValue

28、=“teacher“,/ pk_key字段的值allocationSize=1/自增变量)主键注解IdGeneratedValue(strategy=GenerationType.TABLE,generator=“TEACHER_GEN“) 联合主键生成策略一般采用这种方式,比如有一个类 Student(id,name,age),为了产生联合主键 ,把 id 和 name 分离出来.Student(pk,age) StudentPk(id,name)StudentPk 类必需实现序列化接口 implements java.io.Serializable.StudentPk 类必需重写 bool

29、ean equals() ,int hasCode()方法Overridepublic boolean equals(Object o) if(o instanceof StudentPk) StudentPk pk = (StudentPk)o;if(this.id = pk.getId() return false;Overridepublic int hashCode() return this.name.hashCode();联合主键生成策略 XML 配置方法联合主键生成策略 annotation 配置方法定义组合主键的三种方式: (少用) 将组件类注解为Embeddable,并将组件

30、的属性注解为Id.实体模型 Teacher(teacherPK,age) TeacherPk(id,name)在 TeacherPk(id,name)中把类注解 Embeddable在 Teacher(teacherPK,age)中把组件属性 teacherPK 注解Id 将组件的属性注解为EmbeddedId. 实体模型 Teacher(teacherPK,age) TeacherPk(id,name)只需要在 Teacher(teacherPK,age)中把组件属性 teacherPK 注解EmbeddedId (推荐使用)将类注解为IdClass,并将该实体中所有属于主键的属性都注解为

31、Id. 实体模型 Teacher(id,name,age) TeacherPk(id,name)在 Teacher(id,name,age)中把类注解IdClass(value=”TeacherPk.Class”),在主键属性 id,name上注解Id 即可.当 IdClass()中只有一个属性默认写成 IdClass(TeacherPk.Class).也就是说Teacher 里面的组件属性 id,name,合起来刚好是类 TeacherPk.对象的三种状态三种状态的区别在于:有没有 ID,ID 在数据库中有没有,在内存中有没有(session 缓存)三种状态Transient:内存中的一个对

32、象,没有 ID,缓存中也没有Persistent:内存中有,缓存中有,数据库中有 IDDetached:内存中有,缓存中没有,数据库有 ID核心接口开发介绍Configuration1 AnnotationConfiguration2 进行配置信息的管理3 用来产生 SessionFactory:buildSessionFactory()4 可以在 configure()方法中指定 hibernate 配置文件SchemaExport可以在程序中控制生成建表语名.位于包 import org.hibernate.tool.hbm2ddl.SchemaExport;create(boolean

33、script,boolean export)script - print the DDL to the console export - export the script to the databaseConfiguration cfg=new AnnotationConfiguration().configure();SchemaExport export=new SchemaExport(cfg);export.create(true, true);或者new SchemaExport(new AnnotationConfiguration().configure().create(fa

34、lse, true);SessionFactory1 用来产生和管理 sesssion2 通常情况下,每个应用只需要一个 SessionFactory,除非要访问多个数据库的情况3 openSession()与 openSession() openSession()总是创建新的session,需要手动close(). getCurrentSession()事务自动提交并且自动关闭.从上下文环境中获得 session,如果当时环境中不存就创建新的.如果环境中存在就使用环境中的,而且每次得到的都是同一个 session(在 session 提交之前,提交之后就是新的了).用途:界定事务边界. 所谓

35、的上下文参见配置文件thread取值范围 jta | thread | managed | custom.Class JTA 简介Session管理一个数据库的任务单元,即管理数据库中的增删改查操作,提交事务.方法 CRUD:save(),delete(),update(),saveOrUpdate(),load(),get(),clear().session.beginTransaction();session.save(Object obj);session.getTransaction().commit();session.close();get()与 load()的区别 查找时,都会优

36、先从 session 的缓存中查找. 查找不存在对应记录时,表现不一样.load 方法查找不到时不会报错 ,get 查找不到时会报错. Load 返回的是代理对象,等到真正要用到对象的内容时才发起 SQL 语句.get 直接发起SQL 语句从数据库中取出,不会延迟.Update()方法1 用来更新 detached 对象, 更新完成之后成为 persistent.2 更新 transient 对象会报错. 更新自己设定 id(前提是 id 在数据库中存在)的transient 对象可以.3 持久化的对象只要设定不同字段就会发生更新4 更新部分更改的字段(三种方法) XML 设定 propert

37、y 标签的 update=true|false 属性,annotation 设定 Column(updatable=false)属性, 这种方式少用,不灵活. XML 设定 class 标签的 dynamic-update=”true”属性,同一个 session 中可以,跨 session 不行.跨 session 时的实现方法不过可以用session 的 merge().merge 方法会先从数据库 load,将得到的和数据库中的进行对比,再update 更改过的字段.JPA1.0 Annotation 没有对应的属性,Hibernate 使用 HQL(EJBQL)(建议使用)clear(

38、)方法:清除 session 中的缓存.调用 clear()方法会强制清除 session 缓存.不会与数据库打交道.flush()方法:当 session 的事务提交后,会强制进行从内存(session 缓存)到数据库的同步.默认情况下是 session 的事务提交时才同步. 不常用.Query 接口关系映射这里的关系映射指的是对象之间的关系,并不是指数据库的关系. 关系映射解决的问题是,当对象处于各种关系时,数据库表该如何映射,编程时如何处理.一对一:单向(主键,外键),双向( 主键,外键)一对多:单向,双向(和多对一双向相同)多对一:单向,双向(一对多双向和多对一双向是一样的)多对多:单

39、向,双向(一对一单/双向主键关联映射,只作了解)集合映射:list ,map,set继承映射(了解):单表,多表,一张主表多张子表组件映射:Embeddable,Embedded一对一(one to one) 单向关联映射两个对象是一对一的的关系.有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值, 以表明他们之间的一对一的对应关系; 数据库表不会有额外的字段来维护他们之间的关系,仅通过表的主键关系来维护.一对一主键关联映射默认了级联属性,其关联对象会同时存储. 所以不会抛出TransientObjectException 异常. 唯一外键关联:外键关联,本来是用于多对

40、一的配置,但是如果加上唯一的限制之后,也可以表示一对一的关联关系. unique=“true“.单向关联,如 Person-person_id;加载 person 信息时能关联对应的 person_id 信息双向关系,加载任何一方,都能关联出别一方的信息.注意 id 的主键生成策略,foreign 使用另外一个相关联的对象的标识符。通常和联合起来使用。类Person(id,name,idCard), 类IdCard(id,cardNo)一对一(单向)基于主键关联映射(了解)XML 配置方法一对一单向主键关联通常使用一个特定的 id 生成器。idCardone-to-one 不会加载字段 ,它告

41、诉 HIBERNATE 怎样加载其引用对象 .如何加载呢,默认根据主键加载其引用对象.如在 t_person 中查到 id=2,自动加载 t_idCard 中 id=2 的对象信息. constrained=“true“,表明 person 主键是个外键,表示当前主键上存在着 idCard 约束,当前主键 id 作为外键,参照了 idCard.idCard表明 person 中的 id 来源于 idCard,也就是共享 idCard 的主键.Annotation 配置一对一 (单向) 主键关联映射.(BUG)OneToOnePrimaryKeyJoinColumn有 BUG,系统不会生成主键映

42、射.推荐使用 XML 配置方法.一对一(单向) 基于外键关联映射和单向多对一关联几乎是一样的。唯一不同的就是单向一对一关联中的外键字段具有唯一性约束。这种方法会在表中生成一个新的外键字段.如果不限制外字段的唯一性约束,就会导致产生多对一的关联. 指定多的一端 unique=“true“,这样就限制了多的一端的多重性为一.这种状态注意 TransientObjectException 异常.在保存时就先保存外键 idCard,再保存Person 类.一对一单向外键关联 Annotation 配置OneToOneJoinColumn(name=“指定生成的外键字段名字“ )一对一(双向)主键关联映

43、射 (了解)PersonIdCard.在另一端也加上一个一对一的单向关联映射.模型对象Person(id,name,idCard) IdCard(id,cardNo,person)中,双方都持有对方的属性引用.一对一(双向)主键关联映射 XML 配置方式在 IdCard 配置中建立映射, 指示 Hibernate 如何加载,默认情况下根据主键加载.也就是在基于单向一对一的映射中, 在另一端也加上一个单向一对一的主键关联映射.在 Person 一端配置idCard在另一端 IdCard 配置一对一(双向)主键关联映射 Annotation(有 BUG)在两端各自的引用属性上加上OneToOneP

44、rimaryKeyJoinColumn一对一(双向)唯一外键关联映射Person-IdCard.在另一端也加上一个一对一的单向关联映射.在模型对象Person(id,name,idCard) IdCard(id,cardNo,person),双方都持有对方的属性引用.需要在另一端加上,指示 hibernate 如何加载,默认情况下根据主键加载person;因为外键关联映射中, 两个实体的关系是由 person 的外键 idCard 来维护的,所以不能指定 person 的主键来加载 person,而应根据 person 的外键 idCard 来加载 person对象.一对一双向外键关联映射 X

45、ML 配置方式Person 一端:用多对一配置外键唯一形成一对一的配置方式 .IdCard 一端:一对一,引用另一端外键要想加载 idCard,如果不加 property-ref,默认根据 person 主键 id 来加载,property- ref=“idCard“就指示 hibernate 从 person 里面的 idCard 属性来加载.一对一双向外键关联映射 Annotation 配置方式双方互持对方的属性的引用关系模型Husband(id,name,wife) Wife(id,name,husband)在 Husband 一端的 wife 属性上注解OneToOne/JoinCol

46、umn在 Wife 一端的 husband 加上注解, mappedByOneToOne(mappedBy=“wife“)引用属性加上 mappedBy 属性后就可以在 wife 这一端告知这个关联是在 wife 属性上设置的.就不用管理 wife 这一端生成的 husband 的设置. 生成的 wife 表格不会有 husband 字段.规律:有双向关联时 mappedBy 通常必设.联合主键一对一单向外键关联映射对象模型Wife(id,name,age) WifePk(id,name)Husband(id,name,wife)1 在 Wife 中建立联合主键生成策略IdClass(Wife

47、Pk.Class)Id2 在 Husband 中添加个外键即可OneToOne3 自定义 Husband 中外键的名字OneToOneJoinColumns(JoinColumn(name=“wifeId“, referencedColumnName=“id“),JoinColumn(name=“wifeName“, referencedColumnName=“name“)XML 配置方式:略组件映射对象关系:一个对象是另一个对象的一部分数据库表:是一张表Annotation:Embeddable,EmbeddedXML:对象模型Husband(id,name,wife)Wife(wifeNa

48、me,wifeAge)Annotation:在 Husband 的 wife 属性上建立注解Embedded 表明该对象是从别的位置嵌入过来的, 是不需要单独映射的表.这种方式生成的表为 husband(id,name,wifename,wifeage),不会生成 wife 表.AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射:XML:多对一(many to one)单向关联映射多对一的数据库设计原则:在多的那下端加外键/注意在创建实体类属性时应尽量避免与 SQL 语句中的关键字重名 .多对一单向关联映射实体模型(User 多对一 Group)User(id,na

49、me,group)多Group(id,groupname)一Annotation 配置EntityTable(name=“t_group“)/注意表名与 SQL 中关键字重名只需要在多的一端 User 属性 group 进行注解配置ManyToOneJoinColumn(name=”groupId”)XML 配置标签会在”多”的一端添加外键,相当于在数据库中添加外键生成的表为 user(id,name,groupid),t_group(id,groupname)属性 cascade取值 all,none,save-update,delete,对象间的级联操作 ,只对增删改起作用.在存储时 User 时,设置了 cascade=“all“会自动存储相应的 t_group.而不用管 user 关联的对象(通常情况下会优先存储关联的对象, 然后再存储 user).一对多(one to many)单向关联映射模型(group 一对多

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报