Hibernate之初见(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SweetyoYY/article/details/79199720

* O/R映射

       目前为止我们已经通过应用Hibernate见识过十分基础的O / R映射了,但是还有几种重要的有关映射的话题,我想要讨论一下~

* 1.1 集合映射

       如果一个实例或者类中有特定的变量是集合,那我们可以应用java中的任何可用的接口来映射这些值。Hibernate 可以保存 java.util.Map, java.util.Set,java.util.SortedMap, java.util.SortedSet, java.util.List 和其它持续的实例或者值的任何数组的实例。自己查阅了一些资料,这里做一下搬运工。

集合类型 映射和描述
java.util.Set 它和 \ 元素匹配并且用 java.util.HashSet 初始化。
java.util.SortedSet 它和 \ 元素匹配并且用 java.util.TreeSet 初始化。sort 属性可以设置成比较器或者自然排序。
java.util.List 它和 \ 元素匹配并且用 java.util.ArrayList 初始化。
java.util.Collection 它和 \ 或者 \ 元素匹配以及用 java.util.ArrayList 初始化。
java.util.Map 它和 \ 元素匹配并且用 java.util.HashMap 初始化。
java.util.SortedMap 它和 \ 元素匹配并且用 java.util.TreeMap 初始化。sort 属性可以设置成比较器或者 自然排序。

* 1.2 关联映射

       实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处。对象间的关系的子集可以用下列四种方式解释。关联映射可以是单向的也可以是双向的。

映射类型 描述
Many-to-One 使用 Hibernate 映射多对一关系
One-to-One 使用 Hibernate 映射一对一关系
One-to-Many 使用 Hibernate 映射一对多关系
Many-to-Many 使用 Hibernate 映射多对多关系

       one-to-many 和many-to-one使用的比较多,我对他们的理解就如视图的作用很像,而在这里是对象关联,我们可以通过一个对象找到另一个对象,如果存在一对多的关系,我们也可以通过这个对象找到另一个对象集合。在项目中,遇到了多对一和一对多的情况,这里share~

    例如在项目中,有这样一种情况,二级分类下对应了商品,商品和二级分类是什么关系呢?多对一,那么二级分类和商品又是什么关系呢?一对多。那么在商品的映射文件中我们应该如何配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.itcast.shop.product.vo.Product" table="product">
        <id name="pid">
            <generator class="native"/>
        </id>
        <property name="pname"/>
        <property name="market_price"/>
        <property name="shop_price"/>
        <property name="image"/>
        <property name="pdesc"/>
        <property name="is_hot"/>
        <property name="pdate"/>
        <!--配置映射,商品和二级分类多对一-->
        <many-to-one name="categorySecond" lazy="false" class="cn.itcast.shop.categorysecond.vo.CategorySecond" column="csid"/>
    </class>
</hibernate-mapping>

    在二级分类映射文件中,他们的关系是这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.itcast.shop.categorysecond.vo.CategorySecond" table="categorysecond">
        <id name="csid">
            <generator class="native"/>
        </id>
        <property name="csname"/>
        <!--主外键映射,二级分类和一级分类的关联many-to-one 在多的表中配置-->
        <many-to-one name="category" lazy="false" class="cn.itcast.shop.category.vo.Category" column="cid"/>
        <!--二级分类和商品的关联 一对多-->
        <set name="products">
            <key column="csid"/>
            <one-to-many class="cn.itcast.shop.product.vo.Product"/>
        </set>
    </class>
</hibernate-mapping>

    我们将这两种关系摘出来:

//多对一
<many-to-one name="" class=""/>
//一对多(集合)
<set name="">
    <key column=""/>
    <one-to-many class="">
</set>

      这里的name是当前实体中关联外部对象的属性,当前实体中的字段哦。class后面跟着的是要关联的对象的路径。在一对多中需要配置外键,即为column后面的内容,当然,这个字段也是当前实体的属性哦。

      我相信细心的小伙伴已经发现一些有趣的地方,比如这里:lazy=”false”。那我就要说说了~这里是延迟加载,默认为true,当为true时即为查询二级分类时不会同时把相关的商品查出来,当然这显然不是我们想要的,于是这里我们配置了false。既然说到这里了,有一个知识点还是非说不可了,cascade的属性了,对他的用法我整理了一下,如下:

说明
all 所有情况,均进行级联
none 所有情况,都不进行级联
save-update 执行save/update/saveOrUpdate时进行关联操作
delete 在执行delete 时进行关联操作
all-delete-orphan 包含all和delete的行为

* 查询语言

       Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性,直接对我们的实体对象那个进行操作。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。
    在 HQL 中一些关键字比如 SELECT ,FROM 和 WHERE 等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。

* 2.1 FROM语句

       如果你想要在存储中加载一个完整并持久的对象,你将使用 FROM 语句。以下是 FROM 语句的一些简单的语法:

String hql = "FROM Employee";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

* 2.2 AS 语句

       在 HQL 中 AS 语句能够用来给你的类分配别名,尤其是在长查询的情况下。例如,我们之前的例子,可以用如下方式展示:

String hql = "FROM Employee AS E";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

    关键字 AS 是可选择的并且你也可以在类名后直接指定一个别名,可以省略哦~

* 2.3 SELECT 语句

       SELECT 语句比 from 语句提供了更多的对结果集的控制。如果你只想得到对象的几个属性而不是整个对象你需要使用 SELECT 语句。下面是一个 SELECT 语句的简单语法示例,这个例子是为了得到 Employee 对象的 first_name 字段:

String hql = "SELECT E.firstName FROM Employee E";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

    值得注意的是 Employee.firstName 是 Employee 对象的属性,而不是一个 EMPLOYEE 表的字段。

* 2.4 WHERE 语句

       如果你想要精确地从数据库存储中返回特定对象,你需要使用 WHERE 语句。下面是 WHERE 语句的简单语法例子:

String hql = "FROM Employee E WHERE E.id = 10";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

* 2.5 ORDER BY 语句

       为了给 HSQ 查询结果进行排序,你将需要使用 ORDER BY 语句。你能利用任意一个属性给你的结果进行排序,包括升序或降序排序。下面是一个使用 ORDER BY 语句的简单示例:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

* 2.6 UPDATE 语句

       HQL Hibernate 3 较 HQL Hibernate 2,新增了批量更新功能和选择性删除工作的功能。查询接口包含一个 executeUpdate() 方法,可以执行 HQL 的 UPDATE 或 DELETE 语句。

    public void update(CategorySecond categorySecond) {
        this.getHibernateTemplate().update(categorySecond);
    }

* 2.7 DELETE 语句

       DELETE 语句可以用来删除一个或多个对象。以下是使用 DELETE 语句的简单语法:

    public void delete(CategorySecond categorySecond) {
        this.getHibernateTemplate().delete(categorySecond);
    }
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
             "GROUP BY E.firstName";
Query query = this.getHibernateTemplate().find(hql);
List results = query.list();

* HAPPY ENDING

       本来是一篇的博文,写着写着就成了两篇,这是自己的上篇博文,欢迎阅读~,总结总是要花费好多的时间哦,不过还好,知识回炉一下也挺好的~加油啊~

猜你喜欢

转载自blog.csdn.net/SweetyoYY/article/details/79199720
今日推荐