Java学习笔记之Hibernate-用注解方式实现一对多单项

来源:互联网 发布:一级域名注册 编辑:程序博客网 时间:2024/06/03 10:33

前奏:以学生和班级为例,学生和班级是一对多的关系,所谓一对多单项,是指可以通过班级找到学生并操作学生,学生不可以反过来操作班级,本例子用注解方式实现一对多单项,采用的仍然是mysql数据库

实体类 :学生Student.java

package com.web0818;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name = "student")public class Student {    @Id    @Column(name = "sid")    @GeneratedValue(strategy = GenerationType.AUTO)    private int sid;    @Column(name = "name", length = 20)    private String name;    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Student() {    }    public Student(int sid, String name) {        this.sid = sid;        this.name = name;    }    @Override    public String toString() {        return "Student [sid=" + sid + ", name=" + name + "]";    }}

实体类:班级Classes.java

package com.web0818;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name = "classes")public class Classes {    @Id    @Column(name = "cid")    @GeneratedValue(strategy = GenerationType.AUTO)    private int cid;    @Column(name = "name", length = 20)    private String name;    // 指定一对多关系    @OneToMany(cascade = { CascadeType.ALL })    // 指定与本类主键所对应的外表的外键    @JoinColumn(name = "cid")    private Set<Student> students;    public int getCid() {        return cid;    }    public void setCid(int cid) {        this.cid = cid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Set<Student> getStudents() {        return students;    }    public void setStudents(Set<Student> students) {        this.students = students;    }    public Classes() {    }    public Classes(int cid, String name, Set<Student> students) {        this.cid = cid;        this.name = name;        this.students = students;    }}

hibernate.cfg.xml 配置文件

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>    <!-- 链接数据库的用户名 -->    <property name="connection.username">root</property>    <!-- 链接数据库的密码 -->    <property name="connection.password">lixin123</property>    <!-- 链接数据库的驱动 -->    <property name="connection.driver_class">        com.mysql.jdbc.Driver    </property>    <!-- 链接数据库的url -->    <property name="connection.url">        jdbc:mysql://localhost:3306/test    </property>    <!--         方言        告诉hibernate使用什么样的数据库,hibernate就会在底层拼接什么样的sql语句    -->    <property name="dialect">        org.hibernate.dialect.MySQLDialect    </property>    <!--         根据持久化类生成表的策略        validate   通过映射文件检查持久化类与表的匹配        update   每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么都不做了        create   每一次hibernate启动的时候,根据持久化类和映射文件生成表        create-drop    -->    <property name="hbm2ddl.auto">update</property>    <property name="show_sql">true</property>    <property name="format_sql">true</property>    <mapping class="com.web0818.Classes" />    <mapping class="com.web0818.Student" /></session-factory></hibernate-configuration>

测试工具类HibernateUtils.java

package com.web0818;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;public class HibernateUtils {    private static SessionFactory sessionFactory;    private static ServiceRegistry serviceRegistry;    public static SessionFactory getSessionFactory() {        Configuration configuration = new Configuration();        configuration.configure();        serviceRegistry = new ServiceRegistryBuilder().applySettings(                configuration.getProperties()).buildServiceRegistry();        sessionFactory = configuration.buildSessionFactory(serviceRegistry);        return sessionFactory;    }}

测试类:HibernateTest.java

package com.web0818;import java.util.HashSet;import org.hibernate.Session;import org.hibernate.Transaction;import org.junit.Test;public class HibernateTest {    @Test    public void test1(){        // 测试SessionFactory 和session配置        Session s = HibernateUtils.getSessionFactory().openSession();        System.out.println(s);    }    @Test    public void test2(){        // 添加班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        Classes classes = new Classes();        classes.setName("2班");        s.save(classes);        transaction.commit();    }    @Test    public void test3(){        // 添加学生        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        Student student =  new Student();        student.setName("小明");        s.save(student);        transaction.commit();    }    @Test    public void test4(){        // 添加班级 建立学生和班级的关系 只保存班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 新建班级        Classes classes = new Classes();        classes.setName("3班");        // 新建学生        Student student =  new Student();        student.setName("小花");        HashSet<Student> students = new HashSet<Student>();        students.add(student);        //建立关系        classes.setStudents(students);        //只保存班级        s.save(classes);        transaction.commit();    }    @Test    public void test5(){        // 添加班级 从数据库中取得学生 建立和班级的关系 保存班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 新建班级        Classes classes = new Classes();        classes.setName("4班");        // 取得学生        Student student =  (Student) s.get(Student.class, 1);        HashSet<Student> students = new HashSet<Student>();        students.add(student);        //建立关系        classes.setStudents(students);        //只保存班级        s.save(classes);        transaction.commit();    }    @Test    public void test6(){        // 添加学生 从数据库中取得班级 建立和班级的关系 更新班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 获取班级        Classes classes =(Classes) s.get(Classes.class, 1);        // 新建学生        Student student =  new Student();        student.setName("小红");        //建立关系        classes.getStudents().add(student);        //只保存班级        s.update(classes);        transaction.commit();    }    @Test    public void test7(){        //  从数据库中取得班级 和学生  改变学生的班级  只更新班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 获取班级        Classes classes =(Classes) s.get(Classes.class, 1);        // 获取学生        Student student =  (Student) s.get(Student.class, 1);        //建立关系        classes.getStudents().add(student);        //只保存班级        s.update(classes);        transaction.commit();    }    @Test    public void test8(){        //  从数据库中取得班级 清空该班所有学生        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 获取班级        Classes classes =(Classes) s.get(Classes.class, 1);        //建立关系 清空学生        classes.setStudents(null);        //只保存班级        s.update(classes);        transaction.commit();    }    @Test    public void test9(){        //  从数据库中取得班级 删除班级和班级里的学生 只删除班级        Session s = HibernateUtils.getSessionFactory().openSession();        Transaction transaction = s.beginTransaction();        // 获取班级        Classes classes =(Classes) s.get(Classes.class, 1);        s.delete(classes);        transaction.commit();    }}

因为博主一开始并没有在mysql中创建表,执行test1的时候会自动根据你写的注解配置创建表,创建的表结构如下图
student表结构
这里写图片描述
也有自动生成的外键,见下图
这里写图片描述
classes表结构这里写图片描述

以前看的教程都是用hbm.xml文件来配置关系,如果实体类特别多的话肯定特别麻烦,所以又学习学习注解方式配置,仅供参考。

阅读全文
0 0
原创粉丝点击