Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  java  >  正文 Hibernate含List属性的持久化类的CRUD操作范例

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

发布时间:2017-12-12   编辑:www.jquerycn.cn
jquery中文网为您提供Hibernate含List属性的持久化类的CRUD操作范例等资源,欢迎您收藏本站,我们将为您提供最新的Hibernate含List属性的持久化类的CRUD操作范例资源
本文章来给各位同学介绍一下关于Hibernate含List属性的持久化类的CRUD操作范例,希望有兴趣的朋友进入参考哦。

1.hibernate.cfg.xml

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy7722')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy7722>

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

<hibernate-configuration>
<session-factory>
    <!-- 配置数据库方言 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 配置数据库的驱动 -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 配置数据库用户名 -->
    <property name="hibernate.connection.username">root</property>
    <!-- 配置数据库的密码 -->
    <property name="hibernate.connection.password">root</property>
    <!-- 配置数据库的url -->
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    <!-- 配置数据池的最大容量 -->
    <property name="hibernate.c3p0.max_size">20</property>
    <!-- 配置数据池的最小容量 -->
    <property name="hibernate.c3p0.min_size">1</property>
    <!-- 配置数据链接的超时界限 -->
    <property name="hibernate.c3p0.timeout">5000</property>
    <!-- 在控制台显示后台是否打印执行的sql -->
    <property name="hibernate.show_sql">true</property>
    <!-- 是否以友好的格式显示打印的sql -->
    <property name="hibernate.format_sql">true</property>
    <!-- 打印一些辅助性的注释 -->
    <property name="hibernate.use_sql_comments">true</property>

    <property name="hibernate.c3p0.max_statements">100</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>
    <!-- 配置数据操作的方式 -->
    <property name="hbm2ddl.auto">update</property>
    <!-- 将我们上面 Person 的映射文件添加进来 -->
    <mapping resource="org/Rudiment/hibernate/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>


2.持久化类 Person

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy9056')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy9056>

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<String> schools = new ArrayList<String>();
   
    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<String> getSchools() {
        return schools;
    }
    public void setSchools(List<String> schools) {
        this.schools = schools;
    }
}

3. Person.cfg.xml

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1977')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1977>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-9-8 20:44:11 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="org.Rudiment.hibernate.Person" table="PERSON">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
        <list name="schools" inverse="false" table="SCHOOL" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <list-index></list-index>
            <element type="java.lang.String">
                <column name="SCHOOLS" />
            </element>
        </list>
    </class>
</hibernate-mapping>

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

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1889')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1889>

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<String> schools = new ArrayList<String>();
            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表中。

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy8480')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy8480>

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表中。

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy8268')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy8268>

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 上

 

您可能感兴趣的文章:
Hibernate含List属性的持久化类的CRUD操作范例
Java中Hibernate单向(1-N)映射实例详解
Hibernate save()与persist()区别
java学习笔记之Hibernate基本包作用
Java分层 service/action/DAO 总结
Hibernate单向1-1含连接表映射实例详解
Hibernate学习笔记之基本配置详解
Hibernate下数据批量处理解决方案
Hibernate以组件作为复合主键实例详解
Hibernate基本的CRUD操作实例(更新,保存,删除,查询)

[关闭]