一、班级学生一对多映射实现(单向)                                    
Class 1 * Student 一对多
在学生多的一方,配置一的对象;
 
com.cy.model.Class:
  1. package com.cy.model;
  2.  
  3. public class Class {
  4. private long id;
  5. private String name;
  6.  
  7. public long getId() {
  8. return id;
  9. }
  10. public void setId(long id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. }

com.cy.model.Student:

  1. package com.cy.model;
  2.  
  3. public class Student {
  4. private long id;
  5. private String name;
  6. private Class c;
  7.  
  8. public long getId() {
  9. return id;
  10. }
  11. public void setId(long id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. public Class getC() {
  22. return c;
  23. }
  24. public void setC(Class c) {
  25. this.c = c;
  26. }
  27.  
  28. @Override
  29. public String toString() {
  30. return "Student [id=" + id + ", name=" + name + "]";
  31. }
  32.  
  33. }

Class.hbm.xml:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.cy.model">
  6. <class name="Class" table="t_class">
  7. <id name="id" column="classId">
  8. <generator class="identity"></generator>
  9. </id>
  10. <property name="name" column="className"></property>
  11. </class>
  12. </hibernate-mapping>

Student.hbm.xml:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.cy.model">
  6. <class name="Student" table="t_student">
  7. <id name="id" column="stuId">
  8. <generator class="identity"></generator>
  9. </id>
  10. <property name="name" column="stuName"></property>
  11. <!--
  12. 属性名是c;
  13. 表的外键的列名是classId,关联类com.cy.model.Class
  14. -->
  15. <many-to-one name="c" column="classId" class="com.cy.model.Class"></many-to-one>
  16. </class>
  17. </hibernate-mapping>

hibernate.cfg.xml:

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7.  
  8. <session-factory>
  9.  
  10. <!--数据库连接设置 -->
  11. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  12. <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
  13. <property name="connection.username">root</property>
  14. <property name="connection.password">root</property>
  15.  
  16. <!-- 方言 -->
  17. <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
  18.  
  19. <!-- 控制台显示SQL -->
  20. <property name="show_sql">true</property>
  21.  
  22. <!-- 自动更新表结构 -->
  23. <property name="hbm2ddl.auto">update</property>
  24.  
  25. <mapping resource="com/cy/model/Student.hbm.xml"/>
  26. <mapping resource="com/cy/model/Class.hbm.xml"/>
  27. </session-factory>
  28.  
  29. </hibernate-configuration>

测试程序:

  1. public class StudentTest {
  2. public static void main(String[] args) {
  3. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  4. Session session = sessionFactory.openSession();
  5. session.beginTransaction();
  6.  
  7. Class c = new Class();
  8. c.setName("08计本");
  9. session.save(c);
  10.  
  11. Student s1 = new Student();
  12. s1.setName("张三");
  13. s1.setC(c);
  14. Student s2 = new Student();
  15. s2.setName("李四");
  16. s2.setC(c);
  17.  
  18. session.save(s1);
  19. session.save(s2);
  20.  
  21. session.getTransaction().commit();
  22. session.close();
  23. }
  24. }

运行之后可以看到建表情况和数据插入情况:

Class表:

Student表:

外键关系:

数据插入成功;

二、Junit4 方法详解                                        

下面是测试代码,验证这一过程:

  1. package com.cy.service;
  2.  
  3. import org.junit.After;
  4. import org.junit.AfterClass;
  5. import org.junit.Before;
  6. import org.junit.BeforeClass;
  7. import org.junit.Test;
  8.  
  9. public class StudentTest2 {
  10.  
  11. @BeforeClass
  12. public static void setUpBeforeClass() throws Exception {
  13. System.out.println("类初始化前调用...");
  14. }
  15.  
  16. @AfterClass
  17. public static void tearDownAfterClass() throws Exception {
  18. System.out.println("类初始化后调用...");
  19. }
  20.  
  21. @Before
  22. public void setUp() throws Exception {
  23. System.out.println("测试方法前调用...");
  24. }
  25.  
  26. @After
  27. public void tearDown() throws Exception {
  28. System.out.println("测试方法后调用...");
  29. }
  30.  
  31. @Test
  32. public void test() {
  33. System.out.println("测试方法...");
  34. }
  35.  
  36. /*
  37. * 打印如下:
  38. 类初始化前调用...
  39. 测试方法前调用...
  40. 测试方法...
  41. 测试方法后调用...
  42. 类初始化后调用...
  43. */
  44. }

三、级联保存更新                                              

比如新建了Class班级,但是没有保存它,但是新建两个Student,引用这个Class,保存这两个Student,观察:

StudentTest3.java:

  1. package com.cy.service;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.junit.After;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8.  
  9. import com.cy.model.Class;
  10. import com.cy.model.Student;
  11. import com.cy.util.HibernateUtil;
  12.  
  13. public class StudentTest3 {
  14. private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  15. private Session session;
  16.  
  17. @Before
  18. public void setUp() throws Exception {
  19. session = sessionFactory.openSession();
  20. session.beginTransaction();
  21. }
  22.  
  23. @After
  24. public void tearDown() throws Exception {
  25. session.getTransaction().commit();
  26. session.close();
  27. }
  28.  
  29. @Test
  30. public void testSaveClassAndStudentWithCascade() {
  31. Class c = new Class(); //临时对象,还没有被持久化
  32. c.setName("08计本");
  33.  
  34. Student s1 = new Student();
  35. s1.setName("张三");
  36. s1.setC(c);
  37. Student s2 = new Student();
  38. s2.setName("李四");
  39. s2.setC(c);
  40.  
  41. session.save(s1); //(cascade为none) student持久化对象引用了一个临时对象,保存抛出异常,保存失败。
  42. session.save(s2);
  43. }
  44.  
  45. }

运行testSaveClassAndStudentWithCascade,发现保存失败:

于是我们修改Student.hbm.xml中的配置:

  1. <hibernate-mapping package="com.cy.model">
  2. <class name="Student" table="t_student">
  3. <id name="id" column="stuId">
  4. <generator class="identity"></generator>
  5. </id>
  6. <property name="name" column="stuName"></property>
  7. <!--
  8. 属性名是c;
  9. 表的外键的列名是classId,关联类com.cy.model.Class
  10. -->
  11. <many-to-one name="c" column="classId" class="com.cy.model.Class" cascade="save-update"></many-to-one>
  12. </class>
  13. </hibernate-mapping>

再次运行testSaveClassAndStudentWithCascade,级联保存成功!!

Hibernate学习4—关联关系一对多映射的更多相关文章

  1. Hibernate学习4—关联关系一对多映射2

    第四节:班级学生一对多映射实现(双向) 查询班级的时候能够获取所有的学生:   在上一节的基础之上:我们在Class端也保存学生的关系: com.cy.model.Class: public clas ...

  2. 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

    近期我也是有点郁闷,究竟是程序中处理关联关系.还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这样的关联关系的话.自己去维护这样的约束.这样的非常乐观的一种做法!或者是直接在数据库中处理这 ...

  3. Hibernate学习之双向一对多映射(双向多对一映射)

    © 版权声明:本文为博主原创文章,转载请注明出处 1.双向映射与单向映射 - 一对多单向映射:由一方(教室)维护映射关系,可以通过教室查询该教室下的学生信息,但是不能通过学生查询该学生所在教室信息: ...

  4. Hibernate学习之单向一对多映射

    © 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xm ...

  5. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  6. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  7. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  8. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  9. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

随机推荐

  1. I/O复用服务器端+回声客户端

    并发服务器的第二种实现方法:I/O复用 服务器端: #include <arpa/inet.h> #include <unistd.h> #include <algori ...

  2. 【小米oj】找出单独的数字

    题目链接:https://code.mi.com/problem/list/view?id=2&cid=0&sid=26251#codearea 描述 给出N个数字.其中仅有一个数字出 ...

  3. iRSF快速简单易用的实现列表、排序、过滤功能

    IRSF 是由javascript编写,iRSF快速简单易用的实现列表.排序.过滤功能(该三种操作以下简称为 RSF ). iRSF由三个类组成. iRSFSource 数据源 iRSFFilter ...

  4. 【Html 学习笔记】第八节——表单实践

    列举一些实践的例子: 1.点击按钮后跳转: <html> <body> <form action="1.html"> First <inp ...

  5. django中如何将多个app归到一个目录下。

    1.当startapps 生成多个app后,为了便于管理,可新建一个apps目录,把应用全部剪切进apps. 如果是在pycharm中,会提示是否自动更新路径,这里要全部选择取消. QQ群交流:697 ...

  6. _routing字段介绍

    一个document通过以下公式被路由到该索引下一个特定的分片: shard_num = hash(_routing) % num_primary_shards _routing的默认值是文档的_id ...

  7. java 静态代理 JDK动态代理 Cglib动态代理

    下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...

  8. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  9. python caffe 在师兄的代码上修改成自己风格的代码

    首先,感谢师兄的帮助.师兄的代码封装成类,流畅精美,容易调试.我的代码是堆积成的,被师兄嘲笑说写脚本.好吧!我的代码只有我懂,哈哈! 希望以后代码能写得工整点.现在还是让我先懂.这里,我做了一个简单的 ...

  10. stark组件02

    1.怎么在显示页面添加新字段(a标签)?在admin.py下注册就好了 当我们需要在admin页面添加新的a标签时,需要引入一个类似safe功能的模块 from django.utils.safest ...