一聚教程网:一个值得你收藏的教程网站

热门教程

Hibernate含List属性的持久化类的CRUD操作范例

时间:2022-06-29 03:14:38 编辑:袖梨 来源:一聚教程网

1.hibernate.cfg.xml

 代码如下 复制代码

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">



   
    org.hibernate.dialect.MySQLDialect
   
    com.mysql.jdbc.Driver
   
    root
   
    word">root
   
    jdbc:mysql://localhost:3306/hibernate
   
    20
   
    1
   
    5000
   
    true
   
    true
   
    true

    100
    3000
    2
    true
   
    update
   
   


2.持久化类 Person

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.ArrayList;
import java.util.List;

public class Person {
    private Integer id;
    private String name;
    private int age;
    private List schools = new ArrayList();
   
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public List getSchools() {
        return schools;
    }
    public void setSchools(List schools) {
        this.schools = schools;
    }
}

3. Person.cfg.xml

 代码如下 复制代码


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


   
       
           
           
       

       
           
       

       
           
       

       
           
               
           

           
           
               
           

       

   

4. 操作持久化类的功能类 PersonHandler

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class PersonHandler {
   
    //插入记录
    public static void insertPerson(Person p)
    {
        Configuration conf = new Configuration();
        conf.configure();
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
        SessionFactory sf = conf.buildSessionFactory(sr);
        Session sess = sf.openSession();
        Transaction tx = sess.beginTransaction();
        sess.save(p);
        tx.commit();
        sess.close();
    }
   
    //更新记录
    public static void updatePerson(Person p)
    {
        Configuration conf = new Configuration();
        conf.configure();
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
        SessionFactory sf = conf.buildSessionFactory(sr);
        Session sess = sf.openSession();
        Transaction tx = sess.beginTransaction();
        sess.update(p);
        tx.commit();
        sess.close();
    }
   
    //删除记录
    public static void deletePerson(Person p)
    {
        Configuration conf = new Configuration();
        conf.configure();
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
        SessionFactory sf = conf.buildSessionFactory(sr);
        Session sess = sf.openSession();
        Transaction tx = sess.beginTransaction();
        sess.delete(p);
        tx.commit();
        sess.close();
    }
   
    //查询记录
    public static Person queryPerson(int id)
    {
        Configuration conf = new Configuration();
        conf.configure();
        ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
        SessionFactory sf = conf.buildSessionFactory(sr);
        Session sess = sf.openSession();
        Person p  = (Person)sess.get(Person.class, id);
        sess.close();
        return p;
    }
   
   
    public static void main(String[] args)
    {
        Person p = new Person();
        /*
            //插入记录
            p.setName("ITkezhan");
            p.setAge(1);
            List schools = new ArrayList();
            schools.add("小学");
            schools.add("初中");
            schools.add("高中");
            p.setSchools(schools);
            insertPerson(p);
         */
       
        /*
           //更新记录
           //括号内的5是对应Person表中的ID
           p = queryPerson(5);
           p.setAge(10);
           p.setName("IT客栈");
           updatePerson(p);
        */
       
        /*
            //删除记录
            //括号内的5是对应Person表中的ID
            p = queryPerson(5);
            deletePerson(p);
        */
       
    }
}


注:

1.只取消PersonHandler这个类main方法的第一个注释块,将会插入一条新的记录到数据库名为hibernate的Person表中。

 代码如下 复制代码

mysql> use hibernate;
Database changed
mysql> select * from person;
+----+----------+------+
| ID | NAME     | AGE  |
+----+----------+------+
|  5 | ITkezhan |    1 |
+----+----------+------+
1 row in set (0.00 sec)

mysql> select * from school;
+----+---------+-----+
| ID | SCHOOLS | idx |
+----+---------+-----+
|  5 | 小学    |   0 |
|  5 | 初中    |   1 |
|  5 | 高中    |   2 |
+----+---------+-----+
3 rows in set (0.00 sec)


2.只取消PersonHandler这个类main方法的第二个注释块,将会更新查询出来的记录到数据库名为hibernate的Person表中。

 代码如下 复制代码

mysql> select * from person;
+----+--------+------+
| ID | NAME   | AGE  |
+----+--------+------+
|  5 | IT客栈 |   10 |
+----+--------+------+
1 row in set (0.00 sec)

mysql> select * from school;
+----+---------+-----+
| ID | SCHOOLS | idx |
+----+---------+-----+
|  5 | 小学    |   0 |
|  5 | 初中    |   1 |
|  5 | 高中    |   2 |
+----+---------+-----+
3 rows in set (0.00 sec)

3.只取消PersonHandler这个类main方法的第三个注释块,将会删除查询出来的记录

下面详谈这些方法的一些注意的地方:

在说这些方法的时候,我们要先约定一些词语意思,Hibernate中的持久化对象支持如下几个对象状态:
瞬态:对象由 new 操作符创建,并且尚未与 Hibernate Session 关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session 可以将其变为持久化状态。
持久化:对象于 Hibernate Session 关联上。对这个对象属性的修改会影响数据库的数据内容。
脱管:曾今持久过的对象。由于与 Hibernate Session 脱离关联,这个对象称为脱管。
详细的概念请查看:轻量级JavaEE企业应用实战P386

=========================save()与persist()方法============================
Hibernate之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯。另一方面,save() 和 persist() 方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性(即对应记录的主键值);但使用persist()方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对象的标识属性值,所以程序执行 save() 方法会立即将持久化对象对应的数据插入数据库;而persist() 则保证当它在一个事务外部被调用时,并不立即转换成 insert 语句,这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。

=========================load()与get()方法============================
load() 方法和 get() 方法的主要区别在于是否延迟加载,使用 load() 方法将具有延迟加载功能,load() 方法不会立即访问数据库,当试图加载的记录不存在时,load() 方法可能返回一个未初始化的代理对象;而 get() 方法总是立即访问数据库,当试图加载的记录不存在时,get()方法将直接返回 null

========================= 脱管对象再次利用注意事项 =========================
对于一个曾经持久化过的、但现在已脱离了 Session 管理的持久化对象,我们把它称为处于脱管状态。当我们修改脱管对象的状态后,程序应该使用新的 Session 来保存这些修改。Hibernate 提供了 update()、merge()和updateOrSave()等方法来保存这些修改。当我们用另外一个Session来保存这种修改后,该脱管对象再次回到Session的管理之下,也就再次回到持久化状态。

========================= update() 和 merge() 方法 =========================
当需要使用update来保存程序对持久化对象所做的修改时候,如果不清楚该对象是否曾经持久化过,那么程序可以选择使用 updateOrSave() 方法,该方法自动判断该对象是否曾经持久化,如果曾经持久化过,就使用 update() 操作; 否则将使用 save() 操作。
merge()方法也可将程序对脱管对象所做的修改保存到数据库,但 merge() 与 update() 方法最大的区别是: merge() 方法不会持久化给定对象。举例来说,当我们执行 session.update(a)代码后,a对象将会变成持久化状态;而执行 session.merge(a)代码后,a对象依然不是持久化状态,a 对象依然不会被关联到 Session 上

 

热门栏目