Hibernate一对多单向(双向)关联映射

(1)、编写配置文件

  Hibernate通过读写默认的XML配置文件hibernate.cfg.xml加载数据库配置信息、代码如下: 

<hibernate-configuration>
 	<session-factory>
		<!-- 数据库驱动 -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库连接的URL -->
		<property name="connection.url">jdbc:mysql://localhost:3306/db_database14</property>
		<!-- 数据库连接用户名 -->
		<property name="connection.username">root</property>
		<!-- 数据库连接密码 -->
		<property name="connection.password"></property>
		<!-- Hibernate方言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 打印SQL语句 -->
		<property name="show_sql">true</property>
		<!-- 映射文件  -->
		<mapping resource="com/wgh/model/Book.hbm.xml" />
		<mapping resource="com/wgh/model/Category.hbm.xml" />
 	</session-factory>
 </hibernate-configuration>

(2)、编写持久化类

  持久化类是Hibernate操作的对象、它与数据库中的数据表相对应

(双向)/**
 * 图书类别持久化类
 */
public class Category {
    private Integer id;            //ID
    private String name;        //类别名称
    private Set<Book> books;    //Set集合(类别中的所有图书)
    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 Set<Book> getBooks() {
        return books;
    }
    public void setBooks(Set<Book> books) {
        this.books = books;
    }
}
(单向)/**
 * 图书类别持久化类
 */
public class Category {
    private Integer id;            //ID
    private String name;        //类别名称
    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 class Book {
    private Integer id;            //ID
    private String name;        //图书名称
    private String author;
    private Category category;    //所属类别
    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 String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

(3)、编写映射文件

(双向)<hibernate-mapping  package="com.wgh.model">
    <class name="Category" table="tb_Category_manytoone3">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" not-null="true" length="200" />
        <!-- 一对多映射 -->
        <set name="books">
            <key column="categoryId"/>
            <one-to-many class="Book"/>
        </set>

    </class>
</hibernate-mapping>
(单向)<hibernate-mapping  package="com.wgh.model">
    <class name="Category" table="tb_Category_manytoone0">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" not-null="true" length="200" />
    </class>
</hibernate-mapping>
<hibernate-mapping package="com.wgh.model">
    <class name="Book" table="tb_book_manytoone0">
        <!-- 主键 -->
        <id name="id">
            <generator class="native"/>
        </id>
        <!-- 图书名称 -->
        <property name="name" not-null="true" length="200" />
        <!-- 作者 -->
        <property name="author" not-null="true" length="50"/>
        <!-- 多对一关联映射 -->
        <many-to-one name="category" class="Category">
            <!-- 映射的字段 -->
            <column name="categoryId"/>
        </many-to-one>
    </class>
</hibernate-mapping>

(4)、编写Hibernate的工具类

package com.wgh.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static SessionFactory sessionFactory = null; // SessionFactory对象
    // 静态块
    static {
        try {
            Configuration cfg = new Configuration().configure(); // 加载Hibernate配置文件
            sessionFactory = cfg
                    .buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                            .buildServiceRegistry());
        } catch (Exception e) {
            System.err.println("创建会话工厂失败");
            e.printStackTrace();
        }
    }

    /**
     * 获取Session
     *
     * @return Session
     * @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            threadLocal.set(session);
        }
        return session;
    }

    /**
     * 重建会话工厂
     */
    public static void rebuildSessionFactory() {
        try {
            Configuration cfg = new Configuration().configure(); // 加载Hibernate配置文件
            sessionFactory = cfg
                    .buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                            .buildServiceRegistry());
        } catch (Exception e) {
            System.err.println("创建会话工厂失败");
            e.printStackTrace();
        }
    }

    /**
     * 获取SessionFactory对象
     *
     * @return SessionFactory对象
     */
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    /**
     * 关闭Session
     *
     * @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
            session.close(); // 关闭Session
        }
    }
}

  

时间: 2024-12-29 11:30:53

Hibernate一对多单向(双向)关联映射的相关文章

Hibernate!!多对多(单向|双向)关联映射

多对多——单向关联映射 1 package com.hb.model; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.Id; 9 import javax.persistence.ManyToMany; 10 import

Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据 多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据 而单向一对多关联映射是在一的一端维护关系的,具有以下的缺点: 必须先保存多的一端后才可以保存一的一端,所以在保存多的一端时多的一端不知道一的一端是否 存在相应的数据,所以只能将维护的关系字段设置为null,如果为非空

hibernate之关于一对一单向,双向关联映射

[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向一对一关 联中的外键字段具有唯一性约束. ok,那我们也可以这样理解,一对一其实就是多对一关联的特殊形式,我们知道Hibernate的配置方式有两种,分别是Annotations,XML两种配置方式! Annotations的一对一单向关联映射 人(User)和***号(Card) @Entity @Ta

Hibernate之关于一对多,多对一双向关联映射

[Hibernate]之关于一对多,多对一双向关联映射 由于一对多,和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name="t_group") publicclass Group { private Integer id; private String name; private Set<Person> persons=newHashSet<Person>();//set不允许重复,最适合数

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一

Hibernate一对一双向关联映射

关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一样的,双向关联映射并不影响存储,只影响加载.所以,双向关联映射和单向关联映射的关系模型是一样的即数据库的表结构是一样的,只是IdCard的实体类和配置文件(IdCard.hbm.xml)发生了一点点变化. 对象模型 从上图中可以

Hibernate之关于多对多双向关联映射

[Hibernate]之关于多对多双向关联映射 多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例. 首先我们还是先看Annotations配置! @Entity @Table(name="t_student") public class Student {     private Integer id;     private String name;     private Integer age;     

Hibernate ManyToOne Mappings 多对一关联映射

Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 例子:多个员工对应一个地址. 一.创建hibernate.cfg.xml 配置文件: 注意数据库名.用户名.密码是否填写正确. <?xml version="1.0" en

Hibernate 一对多单向关联Demo

以Classes[班级]和Student[学生]为例的Demo Classes .java public class Classes implements Serializable { private long Cid; private String Cname; private String Cdesc; private Set<Student> students; //get和set } Student .java public class Student implements Seria