Hibernate学习4—关联关系一对多映射
- package com.cy.model;
- public class Class {
- private long id;
- private String name;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
com.cy.model.Student:
- package com.cy.model;
- public class Student {
- private long id;
- private String name;
- private Class c;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Class getC() {
- return c;
- }
- public void setC(Class c) {
- this.c = c;
- }
- @Override
- public String toString() {
- return "Student [id=" + id + ", name=" + name + "]";
- }
- }
Class.hbm.xml:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.cy.model">
- <class name="Class" table="t_class">
- <id name="id" column="classId">
- <generator class="identity"></generator>
- </id>
- <property name="name" column="className"></property>
- </class>
- </hibernate-mapping>
Student.hbm.xml:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.cy.model">
- <class name="Student" table="t_student">
- <id name="id" column="stuId">
- <generator class="identity"></generator>
- </id>
- <property name="name" column="stuName"></property>
- <!--
- 属性名是c;
- 表的外键的列名是classId,关联类com.cy.model.Class
- -->
- <many-to-one name="c" column="classId" class="com.cy.model.Class"></many-to-one>
- </class>
- </hibernate-mapping>
hibernate.cfg.xml:
- <?xml version='1.0' encoding='utf-8'?>
- <!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="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <!-- 方言 -->
- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
- <!-- 控制台显示SQL -->
- <property name="show_sql">true</property>
- <!-- 自动更新表结构 -->
- <property name="hbm2ddl.auto">update</property>
- <mapping resource="com/cy/model/Student.hbm.xml"/>
- <mapping resource="com/cy/model/Class.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
测试程序:
- public class StudentTest {
- public static void main(String[] args) {
- SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
- Session session = sessionFactory.openSession();
- session.beginTransaction();
- Class c = new Class();
- c.setName("08计本");
- session.save(c);
- Student s1 = new Student();
- s1.setName("张三");
- s1.setC(c);
- Student s2 = new Student();
- s2.setName("李四");
- s2.setC(c);
- session.save(s1);
- session.save(s2);
- session.getTransaction().commit();
- session.close();
- }
- }
运行之后可以看到建表情况和数据插入情况:
Class表:
Student表:
外键关系:
数据插入成功;
二、Junit4 方法详解
下面是测试代码,验证这一过程:
- package com.cy.service;
- import org.junit.After;
- import org.junit.AfterClass;
- import org.junit.Before;
- import org.junit.BeforeClass;
- import org.junit.Test;
- public class StudentTest2 {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- System.out.println("类初始化前调用...");
- }
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- System.out.println("类初始化后调用...");
- }
- @Before
- public void setUp() throws Exception {
- System.out.println("测试方法前调用...");
- }
- @After
- public void tearDown() throws Exception {
- System.out.println("测试方法后调用...");
- }
- @Test
- public void test() {
- System.out.println("测试方法...");
- }
- /*
- * 打印如下:
- 类初始化前调用...
- 测试方法前调用...
- 测试方法...
- 测试方法后调用...
- 类初始化后调用...
- */
- }
三、级联保存更新
比如新建了Class班级,但是没有保存它,但是新建两个Student,引用这个Class,保存这两个Student,观察:
StudentTest3.java:
- package com.cy.service;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import com.cy.model.Class;
- import com.cy.model.Student;
- import com.cy.util.HibernateUtil;
- public class StudentTest3 {
- private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
- private Session session;
- @Before
- public void setUp() throws Exception {
- session = sessionFactory.openSession();
- session.beginTransaction();
- }
- @After
- public void tearDown() throws Exception {
- session.getTransaction().commit();
- session.close();
- }
- @Test
- public void testSaveClassAndStudentWithCascade() {
- Class c = new Class(); //临时对象,还没有被持久化
- c.setName("08计本");
- Student s1 = new Student();
- s1.setName("张三");
- s1.setC(c);
- Student s2 = new Student();
- s2.setName("李四");
- s2.setC(c);
- session.save(s1); //(cascade为none) student持久化对象引用了一个临时对象,保存抛出异常,保存失败。
- session.save(s2);
- }
- }
运行testSaveClassAndStudentWithCascade,发现保存失败:
于是我们修改Student.hbm.xml中的配置:
- <hibernate-mapping package="com.cy.model">
- <class name="Student" table="t_student">
- <id name="id" column="stuId">
- <generator class="identity"></generator>
- </id>
- <property name="name" column="stuName"></property>
- <!--
- 属性名是c;
- 表的外键的列名是classId,关联类com.cy.model.Class
- -->
- <many-to-one name="c" column="classId" class="com.cy.model.Class" cascade="save-update"></many-to-one>
- </class>
- </hibernate-mapping>
再次运行testSaveClassAndStudentWithCascade,级联保存成功!!
Hibernate学习4—关联关系一对多映射的更多相关文章
- Hibernate学习4—关联关系一对多映射2
第四节:班级学生一对多映射实现(双向) 查询班级的时候能够获取所有的学生: 在上一节的基础之上:我们在Class端也保存学生的关系: com.cy.model.Class: public clas ...
- 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
近期我也是有点郁闷,究竟是程序中处理关联关系.还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这样的关联关系的话.自己去维护这样的约束.这样的非常乐观的一种做法!或者是直接在数据库中处理这 ...
- Hibernate学习之双向一对多映射(双向多对一映射)
© 版权声明:本文为博主原创文章,转载请注明出处 1.双向映射与单向映射 - 一对多单向映射:由一方(教室)维护映射关系,可以通过教室查询该教室下的学生信息,但是不能通过学生查询该学生所在教室信息: ...
- Hibernate学习之单向一对多映射
© 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xm ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
- Hibernate学习之——搭建log4j日志环境
昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
随机推荐
- I/O复用服务器端+回声客户端
并发服务器的第二种实现方法:I/O复用 服务器端: #include <arpa/inet.h> #include <unistd.h> #include <algori ...
- 【小米oj】找出单独的数字
题目链接:https://code.mi.com/problem/list/view?id=2&cid=0&sid=26251#codearea 描述 给出N个数字.其中仅有一个数字出 ...
- iRSF快速简单易用的实现列表、排序、过滤功能
IRSF 是由javascript编写,iRSF快速简单易用的实现列表.排序.过滤功能(该三种操作以下简称为 RSF ). iRSF由三个类组成. iRSFSource 数据源 iRSFFilter ...
- 【Html 学习笔记】第八节——表单实践
列举一些实践的例子: 1.点击按钮后跳转: <html> <body> <form action="1.html"> First <inp ...
- django中如何将多个app归到一个目录下。
1.当startapps 生成多个app后,为了便于管理,可新建一个apps目录,把应用全部剪切进apps. 如果是在pycharm中,会提示是否自动更新路径,这里要全部选择取消. QQ群交流:697 ...
- _routing字段介绍
一个document通过以下公式被路由到该索引下一个特定的分片: shard_num = hash(_routing) % num_primary_shards _routing的默认值是文档的_id ...
- java 静态代理 JDK动态代理 Cglib动态代理
下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- python caffe 在师兄的代码上修改成自己风格的代码
首先,感谢师兄的帮助.师兄的代码封装成类,流畅精美,容易调试.我的代码是堆积成的,被师兄嘲笑说写脚本.好吧!我的代码只有我懂,哈哈! 希望以后代码能写得工整点.现在还是让我先懂.这里,我做了一个简单的 ...
- stark组件02
1.怎么在显示页面添加新字段(a标签)?在admin.py下注册就好了 当我们需要在admin页面添加新的a标签时,需要引入一个类似safe功能的模块 from django.utils.safest ...