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
- Java学习笔记之Hibernate-用注解方式实现一对多单项
- Java学习笔记之Hibernate-用注解方式实现一对多双向关联
- Java学习笔记之Hibernate-用注解方式实现多对多
- Hibernate 一对多 单项
- hibernate练习之单项关联一对多
- hibernate注解方式实现一对多映射
- hibernate注解方式实现一对多映射
- hibernate注解方式实现一对多映射
- hibernate注解方式实现一对多映射
- hibernate 注解方式,实现一对多映射
- hibernate注解方式实现一对多映射
- hibernate映射(二) 之Hibernate单项一对多映射
- Hibernate 关联映射 之 一对多单项关联 (一)
- Hibernate 注解 实现一对多
- hibernate注解实现一对多
- hibernate之双向一对多(注解方式)
- Hibernate学习笔记 -- day08 注解含义、一对多关系映射
- 2.2、Hibernate用注解方式实现一对多、多对多关系
- Android图表MPandroidChart之曲线图绘制教程
- CC2540和CC2541的区别
- Android 通过WebService进行网络编程,使用工具类轻松实现
- codeforces 837F. Prefix Sums 思维+二分+组合数
- 输出箭头形状
- Java学习笔记之Hibernate-用注解方式实现一对多单项
- 圆弧方向判断方法和三点确定一个圆的计算方法
- Android 基于google Zxing实现对手机中的二维码进行扫描
- 打印空心菱形
- linux上配置tomcat之 CentOS 7 开放防火墙端口命令
- Android 对Layout_weight属性完全解析以及使用ListView来实现表格
- 管道
- Zephyr OS 驱动篇之设备初始化顺序
- 输出学生信息