- 浏览: 3560918 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (1491)
- Hibernate (28)
- spring (37)
- struts2 (19)
- jsp (12)
- servlet (2)
- mysql (24)
- tomcat (3)
- weblogic (1)
- ajax (36)
- jquery (47)
- html (43)
- JS (32)
- ibatis (0)
- DWR (3)
- EXTJS (43)
- Linux (15)
- Maven (3)
- python (8)
- 其他 (8)
- JAVASE (6)
- java javase string (0)
- JAVA 语法 (3)
- juddiv3 (15)
- Mule (1)
- jquery easyui (2)
- mule esb (1)
- java (644)
- log4j (4)
- weka (12)
- android (257)
- web services (4)
- PHP (1)
- 算法 (18)
- 数据结构 算法 (7)
- 数据挖掘 (4)
- 期刊 (6)
- 面试 (5)
- C++ (1)
- 论文 (10)
- 工作 (1)
- 数据结构 (6)
- JAVA配置 (1)
- JAVA垃圾回收 (2)
- SVM (13)
- web st (1)
- jvm (7)
- weka libsvm (1)
- weka屈伟 (1)
- job (2)
- 排序 算法 面试 (3)
- spss (2)
- 搜索引擎 (6)
- java 爬虫 (6)
- 分布式 (1)
- data ming (1)
- eclipse (6)
- 正则表达式 (1)
- 分词器 (2)
- 张孝祥 (1)
- solr (3)
- nutch (1)
- 爬虫 (4)
- lucene (3)
- 狗日的腾讯 (1)
- 我的收藏网址 (13)
- 网络 (1)
- java 数据结构 (22)
- ACM (7)
- jboss (0)
- 大纸 (10)
- maven2 (0)
- elipse (0)
- SVN使用 (2)
- office (1)
- .net (14)
- extjs4 (2)
- zhaopin (0)
- C (2)
- spring mvc (5)
- JPA (9)
- iphone (3)
- css (3)
- 前端框架 (2)
- jui (1)
- dwz (1)
- joomla (1)
- im (1)
- web (2)
- 1 (0)
- 移动UI (1)
- java (1)
- jsoup (1)
- 管理模板 (2)
- javajava (1)
- kali (7)
- 单片机 (1)
- 嵌入式 (1)
- mybatis (2)
- layui (7)
- asp (12)
- asp.net (1)
- sql (1)
- c# (4)
- andorid (1)
- 地价 (1)
- yihuo (1)
- oracle (1)
最新评论
-
endual:
https://blog.csdn.net/chenxbxh2 ...
IE6 bug -
ice86rain:
你好,ES跑起来了吗?我的在tomcat启动时卡在这里Hibe ...
ES架构技术介绍 -
TopLongMan:
...
java public ,protect,friendly,private的方法权限(转) -
贝塔ZQ:
java实现操作word中的表格内容,用插件实现的话,可以试试 ...
java 读取 doc poi读取word中的表格(转) -
ysj570440569:
Maven多模块spring + springMVC + JP ...
Spring+SpringMVC+JPA
hibernate中单向一对一实现有三种方式:主键关联,外键关联,表关联(自己给的名字,下面会详细说的)。
场景设置:
学生 和 校服 。
我记得我初中的时候,校服忘记在操作了,有人捡到了,但是不知道是谁的,就送到体育办公室,
于是我pdpd的跑去自己拿。
我想说的是: 只能从学生来找到校服,而不能从校服去找到学生,这就是单向的关系。
上代码:
Student:
package com.iteye.endual.bean1; public class Student { private int id ; private String name ; private int num ; private XiaoFu xf = new XiaoFu() ; public Student() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public XiaoFu getXf() { return xf; } public void setXf(XiaoFu xf) { this.xf = xf; } }
校服类:
package com.iteye.endual.bean1; public class XiaoFu { private int id ; private String owername ; public XiaoFu() {} public int getId() { return id; } public void setId(int id) { this.id = id; } public String getOwername() { return owername; } public void setOwername(String owername) { this.owername = owername; } }
hibernate的主配置文件:
<?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> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/test</property> <property name="connection.username">root</property> <property name="connection.password">数据库密码</property> <!-- JDBC connection pool (use the built-in) <property name="connection.pool_size">1</property> --> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management <property name="current_session_context_class">thread</property> --> <!-- Disable the second-level cache <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> --> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <!-- 用谁只能放谁的,他们的名字一样,要冲突的 <mapping resource="com/iteye/endual/bean1/Student.hbm.xml"/> <mapping resource="com/iteye/endual/bean1/XiaoFu.hbm.xml"/> --> <mapping resource="com/iteye/endual/bean2/Student.hbm.xml"/> <mapping resource="com/iteye/endual/bean2/XiaoFu.hbm.xml"/> <mapping resource="com/iteye/endual/bean3/Student.hbm.xml"/> <mapping resource="com/iteye/endual/bean3/XiaoFu.hbm.xml"/> </session-factory> </hibernate-configuration>
sessionFactory 的类,创建这样要花很大大大大大大的资源的哦
package util; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
以下三种方式的单向一对一的实体已经创建好了,配置文件,sessionFactory的类以及好了,这个是公用的。
---------------------------------------------------------------------
第一种,外键关联,也是我们通常在学习数据库设计的时候用到的。
什么是外键关联:
就是在学生表中,加个外键,这个外键的值就是校服表的主键的值。
我们要查询学生,通过学生的主键查询,查到学生的信息,然后就能查到这个外键的值,根据这个值那么可以到
校服表中去查询校服的信息了。
hibernate是面向对象的,所以在个外键是不需要我们在实体中去设置的,需要在配置文件中进行配置的。
看配置文件:
student
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.iteye.endual.bean2.Student" table="t_stu2"> <id name="id" column="stu_id"> <!-- 设置主键 --> <generator class="native"/> <!-- 设置数据库主键的增长方式 --> </id> <property name="name" column="stu_name" /> <!-- <one-to-one name="card" foreign-key="idx" class="endual.bean.Card" > </one-to-one> --> <many-to-one name="xf" class="com.iteye.endual.bean2.XiaoFu" column="fk_id" unique="true" cascade="all"></many-to-one> </class> </hibernate-mapping>
<many-to-one name="xf" class="com.iteye.endual.bean2.XiaoFu" column="fk_id" unique="true" cascade="all">
一对一的单向关系中,就是多对一的特殊情况,所以用到了many to one 的标签。这个标签有个属性是
unique="true",表示这个是一对一的关系。(为什么多开发一套标签来支持一对一呢, 弄 的这么麻烦要拿 别人的修改下。)
cascade="all" 这是表示级联的意思,就是主如此更新的话,那么连接它的也更新,删除也一样,插入也一样。
column="fk_id" 这个是设置了外键的名字,会自动插入到student的表中的去,这个就是校服表的外键,这个值就是校服 表主键的值。
校服表的配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.iteye.endual.bean2.XiaoFu" table="t_xiaofu2"> <id name="id" column="xiaofu_id"> <!-- 设置主键 --> <generator class="native"/> <!-- 设置数据库主键的增长方式 --> </id> <property name="owername" column="stu_name" /> </class> </hibernate-mapping>
junit测试:
package endual.bean2;
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.iteye.endual.bean2.Student; import com.iteye.endual.bean2.XiaoFu; import util.HibernateUtil; import junit.framework.TestCase; public class TestHibernate extends TestCase { /** * 对个实体bean的存储 */ public void test1 () { SessionFactory sf = HibernateUtil.getSessionFactory() ; Session session = sf.openSession() ; XiaoFu xf = new XiaoFu() ; //xf.setId(id) xf.setOwername("chenwei"); Student st = new Student() ; st.setName("chenwei"); st.setNum(123456) ; st.setXf(xf) ; session.save(st) ; Transaction tr = session.beginTransaction() ; tr.commit() ; //System.out.println(pp.getCard().getIdnum()); } }
测试结果:
生成了两张表:(见插入,其他学生表中多了一个外键的字段)
1. session.save(st) ; //保存st,也保存了xf,他们的级联是all. 成功
2. session.save(xf) ;
session.save(st) ; //成功
3. session.save(st) ; //成功
session.save(xf) ;
4.session.save(xf) ; //只插入了校服
增加查找和删除修改和级联的设置有很大的关系
========================================================
第二种方式就是主键关联,我们知道主键的值是唯一的,那么我们将两个表的主键的值是一样的,就可以了嘛。
我们用学生表的主键的值用的是校服表的主键。
这样我们查询学生的时候,就能查到校服的主键,而根据校服的主键我们就能查到校服的信息了。
上代码:
学生表的主键的生成的不能是递增了,我们要用到forein的策略。两张表的字段没有多出来,也只生成两张表。
学生的配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.iteye.endual.bean3.Student" table="t_stu3"> <id name="id" column="stu_id"> <!-- 设置主键 --> <generator class="foreign"> <!-- 主键生成策略为foreign,根据关联类生成主键来产生主键的值 --> <param name="property">xf</param> </generator> </id> <property name="name" column="stu_name" /> <!-- <one-to-one name="card" foreign-key="idx" class="endual.bean.Card" > </one-to-one>--> <one-to-one name="xf" cascade="all" constrained="true"></one-to-one> </class> </hibernate-mapping>
<id name="id" column="stu_id"> <!-- 设置主键 --> <generator class="foreign"> <!-- 主键生成策略为foreign,根据关联类生成主键来产生主键的值 --> <param name="property">xf</param> </generator> </id>
这个配置中就是告诉框架,学生表的主键的值要用的是外面来的,这个外面就是xf这个属性关联的那个表
测试代码:
package endual.bean3; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.iteye.endual.bean3.Student; import com.iteye.endual.bean3.XiaoFu; import util.HibernateUtil; import junit.framework.TestCase; public class TestHibernate extends TestCase { /** * 对个实体bean的存储 */ public void test1 () { SessionFactory sf = HibernateUtil.getSessionFactory() ; Session session = sf.openSession() ; XiaoFu xf = new XiaoFu() ; xf.setOwername("chenwei"); //xf.setId(4) ; Student st = new Student() ; st.setName("chenwei"); st.setNum(123456) ; st.setId(7); st.setXf(xf) ; session.save(st) ; Transaction tr = session.beginTransaction() ; tr.commit() ; } }
测试结果:生成了两种张表(见插图)
测试:
1. session.save(st) ; //成功,两个表都插入了
2. session.save(xf) ; //很显然值插入了一个校服表
3. session.save(xf) ;
session.save(st) ; //两个表都插入了,而且值插入一条的
4. session.save(st) ;
session.save(xf) ; //两个表都插入了,而且只插入了一条的
居然的各自负责测试举例要看情况了
---------------------------------------------------------------------------------------
下面来到了我们的第三中方法,那就是再创建一张表,通过这个来创建单向的连接
我们这表是框架自动会建立的,我们在学生配置文件中设置改表的字段已经名字。
表中放的学生表的主键和校服表的主键,这样我们查找学生的时候,能查到主键,
查到主键,我们在这种表中能查找校服表的主键,这样就能通过校服表的主键,查到校服的信息了。
思路是这样的。
配置文件是:
student的配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.iteye.endual.bean1.Student" table="t_stu1"> <id name="id" column="stu_id"> <!-- 设置主键 --> <generator class="native"/> <!-- 设置数据库主键的增长方式 --> </id> <property name="name" column="stu_name" /> <!-- <one-to-one name="card" foreign-key="idx" class="endual.bean.Card" > </one-to-one>--> <join table="join_stu_xf1"> <key column="xf_id"></key> <!-- 一对一 是 多对一的 一个特殊情况 --> <many-to-one name="xf" class="com.iteye.endual.bean1.XiaoFu" unique="true" cascade="all"></many-to-one> </join> </class> </hibernate-mapping>
<join table="join_stu_xf1"> 校服表的名字,字段是自动生成,也可以自己设置的
测试类:
package endual.bean1;
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.iteye.endual.bean1.Student; import com.iteye.endual.bean1.XiaoFu; import util.HibernateUtil; import junit.framework.TestCase; public class TestHibernate extends TestCase { /** * 对个实体bean的存储 */ public void test1 () { SessionFactory sf = HibernateUtil.getSessionFactory() ; Session session = sf.openSession() ; XiaoFu xf = new XiaoFu() ; xf.setOwername("chenwei"); Student st = new Student() ; st.setName("chenwei"); st.setNum(123456) ; st.setXf(xf) ; session.save(st) ; Transaction tr = session.beginTransaction() ; tr.commit() ; session.close() ; } public void test3 () { SessionFactory sf = HibernateUtil.getSessionFactory() ; Session session = sf.openSession() ; String hql = "from Student as stu where stu.id=?" ; Query query = session.createQuery(hql) ; query.setInteger(0, 1) ; List<Student> lists = query.list() ; Student stu = lists.get(0) ; System.out.println(stu.getName()); //用到了才会去查询的 System.out.println(stu.getXf().getOwername()); // Transaction tr = session.beginTransaction() ; //tr.commit() ; //System.out.println(pp.getCard().getIdnum()); } }
测试结果,生成了三张表:
1.session.save(stu); 成功插入三个表都有数据
2.session.save(xf) ; //失败
3. session.save(xf) ;
session.save(st) ; //成功
4. session.save(st) ;
session.save(xf) ; //成功
------------------------
以上是三个方法的代码?
有一个点我搞不清楚的是,单向连接啊,这箭头是指向的是学生呢还是校服呢 ?呵呵。
发表评论
-
犯规犯规犯规
2015-09-18 16:45 1348http://bbs.hupu.com/4466597.htm ... -
快速掌握Hibernate中悲观锁和乐观锁
2012-10-19 21:33 1619快速掌握Hibernate ... -
Hibernate延迟加载机制
2012-10-19 21:22 1374Hibernate延迟加载 ... -
Hibernate 子类中不能用session 操作数据库
2012-08-28 14:46 1747Object obj = this.g ... -
hibernate3 下载网址
2012-08-28 12:53 1946我的天啊,居然找个hibernate下载的地址也找了半天 h ... -
师父告诉我诀窍
2012-08-23 16:53 1527<value>classpath*:com ... -
spring 整合 hibernate
2012-07-28 10:41 15011.闲话少说了,先看版本吧。 2.在看要导入的包吧: ... -
使用spring的hibernateTemplate的方法 (转)
2012-07-24 17:12 1544使用spr ... -
hibernate 增删改查
2012-07-24 00:07 1876mysql中库表News,字段如下 id | i ... -
hibernate的对象映射配置文件中属性的介绍和说明
2012-03-04 13:45 1698持久化对象之间一对一的关联关系是通过one-to-one 元 ... -
HIbernate主键生成策略详解 (转)
2012-03-04 13:39 1749HIberna ... -
hibernate 复习--demo
2012-03-02 20:40 1562今天晚上,搞好了hibernate的demo了,明天开始就是搞 ... -
HibernateDaoSupport与JdbcDaoSupport
2011-12-30 07:38 17142011年11月07日 星期一 ... -
hibernage getcurrentsession
2011-12-28 18:56 1587org.hibernate.Hibe ... -
hibernate开发资料学习资料
2011-12-28 07:42 1550http://dev.21tx.com/java/struts ... -
hibernate one to many lazy 常见错误解决
2011-06-26 20:17 2614解释一个关于Hibernate l ... -
hibernate的增删改查
2011-06-25 22:03 1861package com.endual.test; impor ... -
frameset
2011-05-25 09:43 1092<a href=url target=_blank> ... -
Hibernate+Spring+Struts2+ExtJS开发CRUD功能
2011-05-17 08:56 4837http://blog.csdn.net/myloon/arc ... -
nginx就启动了
2011-05-13 21:09 1804今天下载了nginx 0.7.52,与以往不同的是,这次版本增 ...
相关推荐
本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...
以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...
在Hibernate中,实现一对一外键单向关联有以下关键步骤: 1. **配置实体类**:首先,你需要为相关的两个实体创建Java类,并定义它们的属性。比如,我们有`Person`和`Profile`两个实体,`Person`实体拥有一个`...
以上就是关于Hibernate外键实现一对一单向关联关系的详细说明。这个知识点涉及到数据库设计、ORM框架的使用,以及Java编程实践,对于理解和使用Hibernate进行数据库操作具有重要意义。在实践中,应结合具体业务场景...
在Hibernate中,实现单向多对一关联主要通过以下几种方式: 1. **配置XML映射文件**:在实体类的XML映射文件中,使用`<many-to-one>`标签定义多对一关联。例如,如果有一个`Employee`类对应`Department`类,可以在`...
总的来说,Hibernate的一对一唯一外键关联(单向关联)是通过在一方实体中定义另一方实体的引用,并通过注解或XML映射文件进行配置来实现的。这种关联方式简化了对象关系的管理,但同时也需要开发者在操作关联对象时...
通过以上步骤,我们便成功使用注解实现了Hibernate中的单向一对多关联映射。这种映射方式在很多场景下都非常实用,如管理用户角色、订单商品等关系。在实际开发中,根据具体需求选择合适的关联映射方式,能有效提高...
### Hibernate一对一关联映射原理 一对一关联映射是指在数据库中两个表之间存在一对一的关系,例如,一个人只有一个身份证,一个身份证也只属于一个人。在Hibernate中,我们可以通过@OneToOne注解来实现这种映射。 ...
本教程聚焦于Hibernate中的单向一对多关联映射,这是一个常见的实体关系模型,广泛应用于各种业务场景。 在数据库设计中,一对多关系意味着一个父表记录可以与多个子表记录相关联。例如,一个学生可以有多个课程,...
**标题:“Hibernate的单向多对一”** 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。在数据模型设计中,多对一是常见的关联关系,其中“多”的一方关联“一...
在Java的持久化框架Hibernate中,单向关系是一种常见的实体关联方式,它涉及到两个实体类之间的关系,但这种关系只在一个方向上可见。在本文中,我们将深入探讨Hibernate中的单向关系,包括其概念、类型、配置以及...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的...以上就是关于Hibernate一对一唯一外键关联映射(单向关联)的详细说明。通过这种方式,我们可以轻松地在Java应用中处理数据库的一对一关系。
本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...
总结来说,Hibernate中的一对一主键关联映射允许两个实体共享同一个主键,实现单向关联时只需在依赖方添加对另一方的引用。在实际应用中,应根据业务需求谨慎选择关联类型,以确保数据的完整性和一致性。
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
本篇文章将详细探讨Hibernate中一对一关联的两种实现方式:基于主键关联和基于外键关联,并通过源码分析及实际应用示例来阐述它们的工作原理和配置细节。 一、基于主键关联 1.1 基本概念 基于主键关联是指两个实体...
**描述分析:**描述链接指向了CSDN上的一篇文章,文章详细介绍了如何在实际项目中使用Hibernate实现一对一单向外键关联。源码是配合教程的示例代码,帮助读者理解并实践所学知识。 **标签解析:“Hibernate 一对一...
- **单向一对一**:只有一个实体知道另一个实体的存在,通常通过在一方的类中定义`@OneToOne`注解来实现。 - **双向一对一**:两个实体相互知道对方,它们都包含对方的引用,分别在两个类中使用`@OneToOne`和`@...
以上就是关于Hibernate一对一关联关系的详细解释,通过理解和掌握这些知识点,你可以更有效地在Java项目中设计和实现数据库模型,提高代码的可读性和维护性。希望这份资源能帮助你更好地理解和运用Hibernate框架。
在Hibernate中,实现单向多对多映射主要涉及到以下几个注解: 1. `@ManyToMany`: 这是定义多对多关系的核心注解,通常放在List、Set或其他集合类型的字段上。它需要两个参数:`targetEntity`指定关联的实体类,`...