一对多 1:*
Employee Dept 一个员工对应一个部门,一个部门对应多个员工
* 1
关系属性 Dept Set<Employee> emps=new HashSet<Employee>();
为什么要使用Set:
1.Set可以去重复
2.如果关系属性是一个集合,要使用set接口类型,而不能使用Hashset,也Hibernate 延迟加载有关系
对象之间的单向和双向关系由业务需求而定
建表
t_employee
普通的列 + 外键列 d_id
t_dept
普通的列
1.建表
create table g_dept( t_id integer primary key, t_dname varchar2(20), t_dno varchar2(20) ) create table g_employee( t_id integer primary key, t_name varchar2(25), t_birthday date, t_salary number(7,2), t_email varchar2(30), d_id integer references g_dept(t_id) )
2.在com.jsu.hb.pojo包中提供2个实体类Employee.java和Dept.java
在Employee.java中
package com.jsu.hb.pojo; import java.util.Date; public class Employee { private Integer id; private String name; private Date birthday; private String email; private double salary; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
在Dept.java中
package com.jsu.hb.pojo; import java.util.HashSet; import java.util.Set; public class Dept { private Integer id; private String dname; private String dno; private Set<Employee> emps = new HashSet<Employee>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getDno() { return dno; } public void setDno(String dno) { this.dno = dno; } public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } }
3.提供映射配置文件(单向)在o2m.hbm.xml文件中
<?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 package="com.jsu.hb.pojo"> <class name="Dept" table="g_dept"> <id name="id" column="t_id"> <generator class="increment"></generator> </id> <property name="dname" column="t_dname"></property> <property name="dno" column="t_dno"></property> <!-- 关系属性 --> <set name="emps" cascade="all" inverse="true"> <key column="d_id"></key> <one-to-many class="Employee"></one-to-many> </set> </class> <class name="Employee" table="g_employee"> <id name="id" column="t_id"> <generator class="increment"></generator> </id> <property name="name" column="t_name"></property> <property name="birthday" column="t_birthday" type="java.util.Date"></property> <property name="email" column="t_email"></property> <property name="salary" column="t_salary"></property> </class> <hibernate-mapping>
4.在hibernate.cfg.xml中对映射文件进行注册
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- show_sql:是否显示hibernate执行的SQL语句,默认为false --> <property name="show_sql">true</property> <!-- show_sql:是否显示hibernate执行格式化输出的SQL语句,默认为false --> <property name="format_sql">true</property> <!-- 配置与数据库连接的参数 --> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:oracle</property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <!-- 2.自身属性相关的配置 dialect:方言 hibernate根据dialect的配置进行特定数据性能方面的调优 --> <property name="dialect">org.hibernate.dialect.Oracle9iDialect</property> <mapping resource="com/jsu/hb/pojo/o2m.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
5.提供HibernateUtil.java配置文件
package com.jsu.hb.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sf; private static ThreadLocal<Session> tl= new ThreadLocal<Session>(); static{ try{ Configuration cfg = new Configuration(); cfg.configure(); sf=cfg.buildSessionFactory(); }catch(Exception e){ e.printStackTrace(); } } public static Session openSession(){ return sf.openSession(); } public static Session getCurrentSession(){ Session session = tl.get();//先从储存的线程中查找 if(session==null){ session=openSession(); tl.set(session); return session; } return session; } }
6.在测试类中TestO2M.java中
package com.jsu.hb.test; import java.util.Date; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.jsu.hb.pojo.Dept; import com.jsu.hb.pojo.Employee; import com.jsu.hb.util.HibernateUtil; public class TestO2M { @Test public void save(){ Dept d = new Dept(); d.setDname("技术部"); d.setDno("1001"); Employee e1 = new Employee(); e1.setName("zhangsan"); e1.setBirthday(new Date()); e1.setEmail("zhangsan@qq.com"); e1.setSalary(1234.0); Employee e2 = new Employee(); e2.setName("tom"); e2.setBirthday(new Date()); e2.setEmail("tom@qq.com"); e2.setSalary(2345.5); Employee e3 = new Employee(); e2.setName("leon"); e2.setBirthday(new Date()); e2.setEmail("leon@qq.com"); e2.setSalary(2351.6); Set<Employee> emps = new HashSet<Employee>(); emps.add(e1); emps.add(e2); emps.add(e3); d.setEmps(emps);//设置在内存中的关系 Session session = HibernateUtil.getCurrentSession(); Transaction tx = session.getTransaction(); tx.begin(); session.save(d); tx.commit(); } }
发表评论
-
Hibernateday06 QBC(Query by Criteria)
2012-07-24 16:59 866QBC (Query by Criteria)由hiberna ... -
Hibernateday06 SQLQuery 和NameQuery
2012-07-24 16:58 1252SqlQuery:在hibernate中使用sql Q ... -
Hibernateday06 HQL(Hibernate Query Language)
2012-07-21 22:18 1209HQL(hibernate query language) ... -
Hibernateday06学习笔记
2012-07-21 21:58 978HQL(hibernate query language) ... -
Hibernateday05继承关系union-subclass映射策略
2012-07-21 21:43 1017union-subclass映射策略 特点:父表 ... -
Hibernateday05继承关系joined-subclass映射策略
2012-07-21 00:07 8372.joined-subclass映射策略 特点:父 ... -
Hibernateday05继承关系subclass映射策略
2012-07-21 00:00 7632.继承关系 O Product //产品 ... -
Hibernateday05由一个主键类,将对象当中的联合作为主键的属性描述成一个对象【主键类的复合主键】
2012-07-20 23:53 8812.由一个主键类,将对象当中的联合作为主键的属性描述成一个对象 ... -
Hibernateday05对象当中的几个属性组合作为表的主键【实体类属性的复合主键】
2012-07-20 23:47 871复合主键 注意:1.对象必须实现序列化接口 1. ... -
Hibernateday05主键生成器(hilo)
2012-07-20 23:36 961主键生成器 generator class="xxx ... -
Hibernateday05学习笔记
2012-07-20 23:24 8101.一对多自身相关 员工找经理 关系属性 Emp ... -
Hibernateday04多对多关系
2012-07-19 23:19 716多对多 O Student C ... -
Hibernateday04一对多的自身相关(双向关系)
2012-07-19 01:04 735自身相关的双向关系 class Emp{ Inte ... -
Hibernateday04一对多的自身相关(从经理找员工)
2012-07-19 00:21 728从经理找员工{1:*} class Emp{ Integ ... -
Hibernateday04一对多的自身相关(从员工找经理)
2012-07-18 23:45 789对多的自身相关 以Emp表为例:一个雇员会有多个下属, ... -
Hibernateday04学习笔记
2012-07-18 23:19 661一对多 O Dept ... -
Hibernateday03一对多双向操作
2012-07-17 23:44 6721.建表 create table g_dept( ... -
Hibernateday03学习笔记
2012-07-17 22:25 6001.Hibernate关联关系 一对一的关联关系 1 ... -
Hibernateday02表的唯一外键
2012-07-24 16:57 863一对一:唯一外键:为外键加上唯一约束 公司 Com ... -
Hibernateday02表的共享主键
2012-07-16 21:55 798关联关系 1:1 人 Person ...
相关推荐
本篇将详细探讨"一对多单向和双向映射"这一主题,结合标签中的"源码"和"工具",我们将深入理解这些概念,并可能涉及到具体的代码实现。 首先,映射是ORM框架的核心,它允许开发者将数据库表与Java类之间的关系进行...
// @ManyToOne注解表示这个字段是一个多对一的关系,对应Parent实体 // cascade属性可以设置成CascadeType.ALL,以处理级联操作,如保存、删除等 @ManyToOne(cascade = CascadeType.ALL) private Parent parent;...
**标题解析:** ...总之,理解并正确配置Hibernate的一对多单向关联,可以帮助我们更高效地进行数据库操作,提高代码的可读性和维护性。实际操作时,应结合具体业务场景和性能需求进行合理设计和优化。
在上述代码中,我们使用了注解`@ManyToOne`和`@JoinColumn`来声明`Address`类中的`person`字段是一个多对一的关联,并指定了外键列的名称。 3. 数据库表结构:`personAdd.sql`可能包含了创建`Person`和`Address`表...
以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...
- **`@ORM\ManyToMany`** 注解表示 `Comment` 与 `FileManaged` 之间是一个多对多的关系。 - **`@ORM\JoinTable`** 注解用于定义关联表的名称及关联字段。 - `name="comments_files"` 表示关联表的名称为 `comments...
了解并正确配置Hibernate的一对多单向关联映射对于Java开发者来说至关重要,它可以帮助我们更高效地处理数据库操作,提升代码的可读性和可维护性。在实际项目中,要根据业务需求选择合适的关联类型和映射方式。通过...
本教程主要探讨的是Hibernate中的一种重要关系映射类型:一对多单向关联。在关系型数据库中,一对多关联是最常见的关系类型,一个实体可以与多个其他实体相关联。在Hibernate中,这种关系可以通过配置XML映射文件或...
理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的数据库操作,减少不必要的数据库交互,提高应用程序的性能。在实际项目中,应根据业务需求灵活选择关联类型,并合理优化查询策略,以...
在本教程中,我们将探讨如何使用注解和XML配置实现Hibernate的一对多单向关联。 首先,让我们理解一对多关联的概念。在数据库中,一对多关联意味着在一个表(父表)中的一个记录可以对应另一个表(子表)中的多个...
在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...
在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...
在本示例中,我们将深入探讨SSH的一对一单向关联及其在登陆过程中的应用,同时也会提及如何实现分页操作。 首先,SSH一对一单向关联指的是一个SSH客户端仅能连接到指定的一个SSH服务器,而不能连接其他服务器。这种...
多对多单向关联 <br>需要注意映射规则: <set name="users" table="t_user_role"><br> <key column="roleid"/><br> <many-to-many class="com.bjsxt.hibernate.User" column="userid"/><br> </set>
本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...
总结来说,理解和掌握Hibernate中的多对一单向关联和多对一双向关联对于提升Java开发者的数据库设计能力和ORM操作技巧至关重要。通过深入学习和实践,我们可以更高效地处理复杂的数据关系,提高应用程序的性能和可...