码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate的学习详解(3)

时间:2015-09-16 09:47:21      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

继承映射:

          1.subclass

 1 <hibernate-mapping package="com.atguigu.hibernate.subclass">
 2 
 3     <class name="Person" table="PERSONS" discriminator-value="PERSON">
 4 
 5         <id name="id" type="java.lang.Integer">
 6             <column name="ID" />
 7             <generator class="native" />
 8         </id>
 9         
10         <!-- 配置辨别者列 -->
11         <discriminator column="TYPE" type="string"></discriminator>
12 
13         <property name="name" type="java.lang.String">
14             <column name="NAME" />
15         </property>
16         
17         <property name="age" type="int">
18             <column name="AGE" />
19         </property>
20         
21         <!-- 映射子类 Student, 使用 subclass 进行映射 -->
22         <subclass name="Student" discriminator-value="STUDENT">
23             <property name="school" type="string" column="SCHOOL"></property>
24         </subclass>
25         
26     </class>
27 </hibernate-mapping>

   技术分享

     

 1 /**
 2      * 缺点:
 3      * 1. 使用了辨别者列.
 4      * 2. 子类独有的字段不能添加非空约束.
 5      * 3. 若继承层次较深, 则数据表的字段也会较多. 
 6      */
 7     
 8     /**
 9      * 查询:
10      * 1. 查询父类记录, 只需要查询一张数据表
11      * 2. 对于子类记录, 也只需要查询一张数据表
12      */
13     @Test
14     public void testQuery(){
15         List<Person> persons = session.createQuery("FROM Person").list();
16         System.out.println(persons.size()); 
17         
18         List<Student> stus = session.createQuery("FROM Student").list();
19         System.out.println(stus.size()); 
20     }
21     
22     /**
23      * 插入操作: 
24      * 1. 对于子类对象只需把记录插入到一张数据表中.
25      * 2. 辨别者列有 Hibernate 自动维护. 
26      */
27     @Test
28     public void testSave(){
29         
30         Person person = new Person();
31         person.setAge(11);
32         person.setName("AA");
33         
34         session.save(person);
35         
36         Student stu = new Student();
37         stu.setAge(22);
38         stu.setName("BB");
39         stu.setSchool("ATGUIGU");
40         
41         session.save(stu);
42         
43     }

 

        2.joined-subclass:

 1 <hibernate-mapping package="com.atguigu.hibernate.joined.subclass">
 2 
 3     <class name="Person" table="PERSONS">
 4 
 5         <id name="id" type="java.lang.Integer">
 6             <column name="ID" />
 7             <generator class="native" />
 8         </id>
 9         
10         <property name="name" type="java.lang.String">
11             <column name="NAME" />
12         </property>
13         
14         <property name="age" type="int">
15             <column name="AGE" />
16         </property>
17         
18         <joined-subclass name="Student" table="STUDENTS">
19             <key column="STUDENT_id"></key>
20             <property name="school" type="string" column="SCHOOL"></property>
21         </joined-subclass>
22         
23     </class>
24 </hibernate-mapping>

技术分享


 1 /**
 2      * 优点:
 3      * 1. 不需要使用了辨别者列.
 4      * 2. 子类独有的字段能添加非空约束.
 5      * 3. 没有冗余的字段. 
 6      */
 7     
 8     /**
 9      * 查询:
10      * 1. 查询父类记录, 做一个左外连接查询
11      * 2. 对于子类记录, 做一个内连接查询. 
12      */
13     @Test
14     public void testQuery(){
15         List<Person> persons = session.createQuery("FROM Person").list();
16         System.out.println(persons.size()); 
17         
18         List<Student> stus = session.createQuery("FROM Student").list();
19         System.out.println(stus.size()); 
20     }
21     
22     /**
23      * 插入操作: 
24      * 1. 对于子类对象至少需要插入到两张数据表中. 
25      */
26     @Test
27     public void testSave(){
28         
29         Person person = new Person();
30         person.setAge(11);
31         person.setName("AA");
32         
33         session.save(person);
34         
35         Student stu = new Student();
36         stu.setAge(22);
37         stu.setName("BB");
38         stu.setSchool("ATGUIGU");
39         
40         session.save(stu);
41         
42     }

3.union-subclass
 1 <hibernate-mapping package="com.atguigu.hibernate.union.subclass">
 2 
 3     <class name="Person" table="PERSONS">
 4 
 5         <id name="id" type="java.lang.Integer">
 6             <column name="ID" />
 7             <generator class="hilo" />
 8         </id>
 9         
10         <property name="name" type="java.lang.String">
11             <column name="NAME" />
12         </property>
13         
14         <property name="age" type="int">
15             <column name="AGE" />
16         </property>
17     
18         <union-subclass name="Student" table="STUDENTS">
19             <property name="school" column="SCHOOL" type="string"></property>
20         </union-subclass>        
21         
22     </class>
23 </hibernate-mapping>

技术分享

 1 /**
 2      * 优点:
 3      * 1. 无需使用辨别者列.
 4      * 2. 子类独有的字段能添加非空约束.
 5      * 
 6      * 缺点:
 7      * 1. 存在冗余的字段
 8      * 2. 若更新父表的字段, 则更新的效率较低
 9      */
10     
11     /**
12      * 查询:
13      * 1. 查询父类记录, 需把父表和子表记录汇总到一起再做查询. 性能稍差. 
14      * 2. 对于子类记录, 也只需要查询一张数据表
15      */
16     @Test
17     public void testQuery(){
18         List<Person> persons = session.createQuery("FROM Person").list();
19         System.out.println(persons.size()); 
20         
21         List<Student> stus = session.createQuery("FROM Student").list();
22         System.out.println(stus.size()); 
23     }
24     
25     /**
26      * 插入操作: 
27      * 1. 对于子类对象只需把记录插入到一张数据表中.
28      */
29     @Test
30     public void testSave(){
31         
32         Person person = new Person();
33         person.setAge(11);
34         person.setName("AA");
35         
36         session.save(person);
37         
38         Student stu = new Student();
39         stu.setAge(22);
40         stu.setName("BB");
41         stu.setSchool("ATGUIGU");
42         
43         session.save(stu);
44         
45     }

 

技术分享

二:检索策略:
            无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略
          若 <class> 元素的 lazy 属性为 true 或取默认值, Session 的 load() 方法不会执行查询数据表的 SELECT 语句, 仅返回代理类对象的实例, 该代理类实例有如下特征:
          由 Hibernate 在运行时采用 CGLIB 工具动态生成
          Hibernate 创建代理类实例时, 仅初始化其 OID 属性
          在应用程序第一次访问代理类实例的非 OID 属性时, Hibernate 会初始化代理类实例
 
 
 
     技术分享

 1 @Test
 2     public void testMany2OneStrategy(){
 3 //        Order order = (Order) session.get(Order.class, 1);
 4 //        System.out.println(order.getCustomer().getCustomerName()); 
 5         
 6         List<Order> orders = session.createQuery("FROM Order o").list();
 7         for(Order order: orders){
 8             if(order.getCustomer() != null){
 9                 System.out.println(order.getCustomer().getCustomerName()); 
10             }
11         }
12         
13         //1. lazy 取值为 proxy 和 false 分别代表对应对应的属性采用延迟检索和立即检索
14         //2. fetch 取值为 join, 表示使用迫切左外连接的方式初始化 n 关联的 1 的一端的属性
15         //忽略 lazy 属性. 
16         //3. batch-size, 该属性需要设置在 1 那一端的 class 元素中: 
17         //<class name="Customer" table="CUSTOMERS" lazy="true" batch-size="5">
18         //作用: 一次初始化 1 的这一段代理对象的个数. 
19     }
20     
21     @Test
22     public void testSetFetch2(){
23         Customer customer = (Customer) session.get(Customer.class, 1);
24         System.out.println(customer.getOrders().size()); 
25     }
26     
27     @Test
28     public void testSetFetch(){
29         List<Customer> customers = session.createQuery("FROM Customer").list();
30         
31         System.out.println(customers.size()); 
32         
33         for(Customer customer: customers){
34             if(customer.getOrders() != null)
35                 System.out.println(customer.getOrders().size());
36         }
37         
38         //set 集合的 fetch 属性: 确定初始化 orders 集合的方式. 
39         //1. 默认值为 select. 通过正常的方式来初始化 set 元素
40         //2. 可以取值为 subselect. 通过子查询的方式来初始化所有的 set 集合. 子查询
41         //作为 where 子句的 in 的条件出现, 子查询查询所有 1 的一端的 ID. 此时 lazy 有效.
42         //但 batch-size 失效. 
43         //3. 若取值为 join. 则
44         //3.1 在加载 1 的一端的对象时, 使用迫切左外连接(使用左外链接进行查询, 且把集合属性进行初始化)的方式检索 n 的一端的集合属性
45         //3.2 忽略 lazy 属性.
46         //3.3 HQL 查询忽略 fetch=join 的取值
47     }
48     
49     @Test
50     public void testSetBatchSize(){
51         List<Customer> customers = session.createQuery("FROM Customer").list();
52         
53         System.out.println(customers.size()); 
54         
55         for(Customer customer: customers){
56             if(customer.getOrders() != null)
57                 System.out.println(customer.getOrders().size());
58         }
59         
60         //set 元素的 batch-size 属性: 设定一次初始化 set 集合的数量. 
61     }
62     
63     @Test
64     public void testOne2ManyLevelStrategy(){
65         Customer customer = (Customer) session.get(Customer.class, 1);
66         System.out.println(customer.getCustomerName()); 
67         
68         System.out.println(customer.getOrders().size());
69         Order order = new Order();
70         order.setOrderId(1);
71         System.out.println(customer.getOrders().contains(order));
72         
73         Hibernate.initialize(customer.getOrders()); 
74         
75         //---------------set 的 lazy 属性------------------
76         //1. 1-n 或 n-n 的集合属性默认使用懒加载检索策略.
77         //2. 可以通过设置 set 的 lazy 属性来修改默认的检索策略. 默认为 true
78         //并不建议设置为  false. 
79         //3. lazy 还可以设置为 extra. 增强的延迟检索. 该取值会尽可能的延迟集合初始化的时机!
80     }
81     
82     @Test
83     public void testClassLevelStrategy(){
84         Customer customer = (Customer) session.load(Customer.class, 1);
85         System.out.println(customer.getClass()); 
86         
87         System.out.println(customer.getCustomerId()); 
88         System.out.println(customer.getCustomerName()); 
89     }

 

  

 

 

 

Hibernate的学习详解(3)

标签:

原文地址:http://www.cnblogs.com/liuqing-bk/p/4812221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!