【郑州校区】三大框架课堂笔记之Hibernate-day07(上)
Hibernate注解开发在hibernate中我们使用注解,可以帮助我们简化hbm文件配置。 PO类注解配置@Entity 声明一个实体 @Table来描述类与表对应 @Id来声明一个主键 @GenerateValue 用它来声明一个主键生成策略 默认情况下相当于native 可以选择的主键生成策略 AUTO IDENTITY SEQUENCE @Column来定义列 注意:对于PO类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列。 列的名称就是属性的名称 @Temporal来声明日期类型 可以选择 TemporalType.DATA 只有年月日 TemporalType.TIME 只有小时分钟秒 TemporalType.TIMESTAMP 有年月日小时分钟秒 我们最终需要在hibernate.cfg.xml文件中将我们类中的注解配置引用生效 问题:1.如果我们主键生成策略想使用UUID类型? 问题2:如果设定类的属性不在表中映射? 对于我们以上讲解的关于属性配置的注解,我们也可以在其对应的getXxx方法去使用 一对多(多对一)@OneToMany @ManyToOne 以Customer与Order为例 Customer类 Order类 示例:保存客户时,保存订单 对于这个示例我们需要在Customer中配置cascade操作,save-update 第一种方式,可以使用JPA提供的注解 第二种方式:可以使用hibernate提供的注解 以下是示例代码 执行后的结果
订单中没有关联客户的id,为什么? 原因:我们在Customer中配置了mappedBy=”c”它代表的是外键的维护由Order方来维护,而Customer不维护,这时你在保存客户时,级联保存订单,是可以的,但是不能维护外键,所以,我们必须在代码中添加订单与客户关系。 扩展:关于hibernate注解@Cascade中的DELETE_ORPHAN过时 s 使用下面方案来替换过时方案 Hibernate关联映射-多对多我们使用注解完成多对多配置. 描述学生与老师. 使用@ManyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedBy表示放置外键维护权。 创建PO类Teacher类中 Student类中 级联保存操作测试 因为我们将外键的维护权利由Student来维护,我们演示保存学生时,将都也级联保存。 我们在Student类中配置了级联 级联删除操作测试 Hibernate关联映射-一对一以人与身份证号为例 一对一操作有两种映射方式: 1. 在任意一方添加外键 2. 主键映射 外键映射创建实体 User类 上述配置,t_user表放弃对外键的维护权利 IDCard类 joinColumn指定外键列名称,当前配置外键是在t_idcard表中 测试代码 主键映射(了解)以Husband与Wife为例 Wife的主键生成策略是identity @PrimaryKeyJoinColumn 说明husband与wife是使用主键映射 Husband的主键我们设置成参考wife的主键方式 测试操作 Hibernate检索方式概述对数据库操作中,最常用的是select.使用hibernate如何select操作。 分为五种: 1导航对象图检索方式,根据已加载的对象导航到其它对象 2.OID检索方式,按照对象的OID来检索对象 3.HQL检索方式,使用面向对象的HQL查询语言 4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 5.本地SQL检索方式,使用本地数据库的SQL查询语句 导航对象图检索方式 Customer c=session.get(Customer.class,2); c.getOrders().size() 通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到 其关联的持久化对象信息。 OID检索方式 Session.get(Customer.class,3); Session.load(Order.class,1); Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。 HQLHQL是我们在hibernate中是常用的一种检索方式。 HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力 因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语 句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。 基本步骤: 1. 得到Session 2. 编写HQL语句 3. 通过session.createQuery(hql)创建一个Query对象 4. 为Query对象设置条件参数 5. 执行list查询所有,它反胃的是List集合 uniqueResut()返回一个查询结果。 数据准备基本检索From 类名; 排序检索条件检索分页检索分组统计检索分组 group by 统计 count max min avg sum 投影检索我们主要讲解是关于部分属性查询,可以使用投影将部分属性封装到对象中。 注意:我们必须在PO类中提供对应属性的构造方法,也要有无参数构造。 命名检索我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行. 问题:hql定义在什么位置? 1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个 实体的配置文件中声明。 2.如果是使用注解来描述PO的配置 我们直接在PO类中使用 如何使用? QBC QBC(query by criteria),它是一种更加面向对象的检索方式。 QBC步骤: 1.通过Session得到一个Criteria对象 session.createCriteria() 2.设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。 Criteria的add方法用于添加查询条件 3. 调用list进行查询 criterfia.list. 基本检索排序检索注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象 条件检索分页检索统计分组检索Count sum avg max min 离线条件检索本地SQL本地sql也支持命名查询。 可以将sql语句定义在hbm文件中,也可以使用注解。 本地命名sql注解定义 如果执行这个命名的sql会产生异常 出现问题的原因:是hibernate不知道执行select * from t_customer后如果将结果封装。 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|