Hibernate一对多实例
本文向大家介绍Hibernate实例一对多的情况,可能好多人还不了解Hibernate实例一对多,没有关系,下面通过一个实例来帮助您理解Hibernate实例一对多,希望本文能教会你更多东西。
先看由满江红翻译团队(RedSaga Translate Team)翻译的一对多配置说明,然后在看例子
一对多关联(One-to-many Associations)
一对多关联 通过外键 连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:
一个被包含的实体的实例只能被包含在一个集合的实例中
一个被包含的实体的实例只能对应于集合索引的一个值中
一个从Product到Part的关联需要关键字字段,可能还有一个索引字段指向Part所对应的表。标记指明了一个一对多的关联。
- <one-to-many
- class="ClassName" (1)
- not-found="ignore|exception" (2)
- entity-name="EntityName" (3)
- node="element-name"
- embed-xml="true|false"
- />
(1) class(必须):被关联类的名称。
(2) not-found (可选 - 默认为exception): 指明若缓存的标示值关联的行缺失,该如何处理: ignore 会把缺失的行作为一个空关联处理。
(3) entity-name (可选): 被关联的类的实体名,作为class的替代。
例子
- <set name="bars">
- <key column="foo_id"/>
- <one-to-many class="org.hibernate.Bar"/>
- set
注意:元素不需要定义任何字段。 也不需要指定表名。
重要提示
如果Hibernate实例一对多关联中的外键字段定义成NOT NULL,你必须把映射声明为not-null="true",或者使用双向关联,并且标明inverse="true"。
1 先建表
- create table student
- (sid varchar ( 32 ) not null primary key ,
- sname varchar ( 16 ),
- sage varchar ( 16 ),
- )
- create table book
- (bid varchar ( 32 ) not null primary key ,
- bname varchar ( 16 ),
- bprice varchar ( 16 ),
- sid varchar ( 32 )
- )
2.写vo Student.java
- package com.test;
- import java.util.Set;
- public class Student
- {
- private String sid;
- private String sname;
- private String sage;
- private Set book;
- public Student()
- {
- }
- // 写上get set
Book.JAVA
- package com.test;
- public class Book
- {
- private String bid;
- private String bname;
- private String bprice;
- public Book()
- {
- }
- //写上get set
3.写对应的映射文件Student.hbm.xml
- xml version="1.0"?>
- PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
- <hibernate-mapping>
- <class name="com.test.Student" table="student" >
- <id name="sid" type="string" unsaved-value="null" >
- <column name="sid" sql-type="char(32)" not-null="true"/>
- <generator class="uuid.hex"/>
- id
- <property name="sname">
- <column name="sname" sql-type="varchar(16)" not-null="true"/>
- property
- <property name="sage">
- <column name="sage" sql-type="varchar(16)" not-null="true"/>
- property
- <set name="book" cascade="all" outer-join="true">
- <key column="sid"/>
- <one-to-many class="com.test.Book" />
- set
- class
- hibernate-mapping
Book.hbm.xml
- xml version="1.0"?>
- PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
- <hibernate-mapping>
- <class name="com.test.Book" table="book" >
- <id name="bid" type="string" unsaved-value="null" >
- <column name="bid" sql-type="char(32)" not-null="true"/>
- <generator class="uuid.hex"/>
- id
- <property name="bname">
- <column name="bname" sql-type="varchar(16)" not-null="true"/>
- property
- <property name="bprice">
- <column name="bprice" sql-type="varchar(16)" not-null="true"/>
- property
- class
- hibernate-mapping
接着把下面的hibernate.properties文件拷到classes目录下。。这里用的是mysql
- hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
- ## MySQL
- hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
- hibernate.connection.driver_class org.gjt.mm.mysql.Driver
- hibernate.connection.url jdbc:mysql://localhost:3306/wjcms
- hibernate.connection.username root
- hibernate.connection.password wujun
- hibernate.connection.pool_size 1
- hibernate.proxool.pool_alias pool1
- hibernate.show_sql true
- hibernate.jdbc.batch_size 0
- hibernate.max_fetch_depth 1
- hibernate.cache.use_query_cache true
4.写测试类了..
- package com.test;
- import net.sf.hibernate.Session;
- import net.sf.hibernate.SessionFactory;
- import net.sf.hibernate.cfg.Configuration;
- import net.sf.hibernate.*;
- import java.util.Set;
- import java.util.HashSet;
- import java.sql.*;
- import java.util.List;
- import java.util.Iterator;
- public class TestOneToMany
- {
- SessionFactory sf;
- Session session;
- public TestOneToMany()
- {
- try
- {
- Configuration cfg = new Configuration();
- sf = cfg.addClass(Student.class).addClass(Book.class).buildSessionFactory();
- }
- catch(HibernateException ex)
- {
- ex.printStackTrace();
- }
- }
- //插入
- public void doCreate()
- {
- try
- {
- session = sf.openSession();
- Student student = new Student();
- student.setSname("小王");
- student.setSage("22");
- Set bookSet = new HashSet();
- Book book = null;
- for(int i=0;i<2;i++)
- {
- book = new Book();
- book.setBname("java "+i);
- book.setBprice("50");
- bookSet.add(book);
- }
- student.setBook(bookSet);
- session.save(student);
- session.flush();
- session.connection().commit();
- }
- catch(HibernateException ex)
- {
- ex.printStackTrace();
- }
- catch(SQLException ex1)
- {
- ex1.printStackTrace();
- }
- finally
- {
- try{
- session.close();
- }
- catch(HibernateException ex2){
- }
- }
- }
- //查询
- public void doQuery()
- {
- try{
- session = sf.openSession();
- Query q = session.createQuery("select s from Student as s");
- List l = q.list();
- Student s = null;
- Book book = null;
- for(int i=0;i<l.size();i++)
- {
- s = (Student)l.get(i);
- System.out.println("姓名: "+s.getSname());
- System.out.println("年龄: "+s.getSage());
- System.out.println("所有的书:");
- Iterator it = s.getBook().iterator();
- while(it.hasNext())
- {
- book = (Book)it.next();
- System.out.println("书名: "+book.getBname());
- System.out.println("价格: "+book.getBprice());
- }
- }
- }
- catch(HibernateException ex){
- ex.printStackTrace();
- }
- finally{
- try{
- session.close();
- }
- catch(HibernateException ex2){
- }
- }
- }
- public static void main(String[] args)
- {
- TestOneToMany t = new TestOneToMany();
- //t.doCreate();
- t.doQuery();
- }
- }
Hibernate一对多实例的更多相关文章
- hibernate 一对多双向关联 详解
一.解析: 1. 一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...
- Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)
本文知识点(目录): 1.Annotation 注解版(只是测试建表) 2.XML版 的实现(只是测试建表) 3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...
- Hibernate一对多配置
刚刚学习了Hibernate框架的基础知识,下面我来说说关于Hibernate一对多的配置 首先是大配置 连接数据库 用户名 和密码 能和小配置连接 部门小配置: 员工小配置: 部门实体类 员工实体类 ...
- Hibernate框架搭建实例
一,Hibernate是一个持久层,是一个专门负责管理数据库连接的框架: 二,Hibernate的搭建实例: 1.在Hibernate的官方网站(http://www.hibernate.org)可以 ...
- Hibernate一对多OnetoMany
------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- Hibernate一对多操作
--------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...
- Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...
- (原创)hibernate 一对多建表实例详解 附上各个注释的含义
这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...
随机推荐
- 关于angular-route后获取路由标签的一些问题
要实现angular路由,我们需要用到angular.js和angular-route.js 在接入网络的情况下,很多网站都可以下载到这个文件. 然后呢,将文件引入到你的HTML中,然后是基础格式 h ...
- 聊聊vue组件开发的“边界把握”和“状态驱动”
vue有着完整的组件化开发机制,但是官网只给了开发的方式,对于开发规范以及组件化开发的最佳实践,还需要我们来摸索.本文就平时开发中的经验来谈谈“把握边界”和“状态驱动”这两个话题. 边界把握 边界把握 ...
- Spring事务隔离级别
REQUIRED:业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. NOT_SUPPORTED:声明方法不需要事务.如果方法没有关联到一 ...
- thinkphp 单字母函数
在ThinkPHP中有许多使用简便的单字母函数(即快捷方法),可以很方便开发者快速的调用,但是字母函数却不方便记忆,本文将所有的字母函数总结一下,以方便以后查找. 1.U() URL组装 支持不同UR ...
- Python Trick
一. 查询函数参数 import inspect print(inspect.getargspec(func)) 二. 查询对象属性 使用 dir() 查询对象属性 使用内置函数 hasattr(ob ...
- node.js如何制作命令行工具(一)
之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务.比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文 ...
- epoll的ET和LT模式比较 - 源码分析
eventpoll是一种文件,它实现了一种机制利用一条rdllist队列来避免阻塞地进行poll.eventpoll归根到底还是在使用poll.而ET比LT高效,并不在于是否使用了poll,更不能说是 ...
- 【转载】Static 关键字的作用
原始日期:2016-07-16 17:53 一 普通的static关键字 1. 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变 ...
- 基于jQuery封装的分页组件
前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...
- MyElipse配置
DK1.6.0+Tomcat6.0+myEclipse的安装配置 C:\Users\Administrator\AppData\Local\Genuitec\Pulse Explorer JDK1.6 ...