关联映射的关系(一对多)
1、 一对多:
一对多关联的分析:在部门Dempartment中设置属性的时候要设置员工Employee对象,而Employee是多个,所以用集合存储起来,在建立实体类的时候,只需在Dempartment类中多写一个:Set<Employee> emps;属性就可以了。
注:不管是多对一还是一对多,实体类所映射的数据库表中的结构是一样的,因为他们就是相同的,就是所站的角度不同而已
完成一对多关联的实例操作的源代码及其解析:(一对多关联和多对一的操作步骤其实是差不多的。)
(1)首先在domain包下新建Department类,Employee类
在Department.java中:
a)要在Department.java类中封装属性 id,name
b)给这两个属性生成getter和setter方法
c) //集合属性反应的是一对多
private Set<Employee> emps;并且生成setter和getter方法
在Employee.java中:
a) 要在Employee.java类中封装id, name,还有一个Department类型的depart属性
b) 生成getter和setter方法
(2)编写映射文件,可根据根目录下的模板进行编写。要写这样两个映射文件:Department.hbm.xml。Employee.hbm.xml
a) Department.hbm.xml映射文件内容:
<!-- 实体类所在的包 -->
<hibernate-mapping
package="com.hbsi.domain">
<!-- 实体类的名字,如果表名和实体类的类名一样的话,那么就可以把table属性缺省 -->
<class name="Department" table="department">
<!-- Java类中的属性怎样和二维表中的字段建立关系,id是主键,特殊 .-1瞬时状态,非-1脱管状态-->
<id name="id" column="id">
<!-- 主键的一个生成器,主键生成器native,自增长的 -->
<generator class="native"/>
</id>
<property name="name" column="name"/>
<!-- 对集合属性进行映射 -->
<set name="emps">
<key column="depart_id"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
b)Employee.hbm.xml映射文件:
<!-- 实体类所在的包 -->
<hibernate-mapping
package="com.hbsi.domain">
<!-- 实体类的名字,如果表名和实体类的类名一样的话,那么就可以把table属性缺省 -->
<class name="Employee" table="employee">
<!-- Java类中的属性怎样和二维表中的字段建立关系,id是主键,特殊 .-1瞬时状态,非-1脱管状态-->
<id name="id" column="id">
<!-- 主键的一个生成器,主键生成器native,自增长的 -->
<generator class="native"/>
</id>
<property name="name" column="name"/>
</class>
</hibernate-mapping>
(3)第三步编写配置文件,也可根据模板代码,将配置文件写入到配置文件中hibernate.cfg.xml。
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///user</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hbsi/domain/Department.hbm.xml"/>
<mapping resource="com/hbsi/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(4)工具类的编写,这样的代码我们都可以参照hibetnate工具类的模板代码的。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//工具类
public final class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil(){
}
static{
Configuration cfg=new Configuration();
cfg.configure();
sessionFactory=cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
}
(5)最后一步,我们就要编写测试类,来进行我们的测试了。编写测试类:One2Many.java
那么我们就来举例来编写一个增加员工的操作的方法:
static Department add(){
Session s=null;
Transaction tx=null;
try{
//得到session对象
s=HibernateUtil.getSession();
tx=s.beginTransaction();
//增加
Department dep=new Department();
dep.setName("depart one");
Employee e1=new Employee();
e1.setName("Tom");
e1.setDepart(dep);//使得对象模型中:对象之间有了相应的关联
Employee e2=new Employee();
e2.setName("Jerry");
e2.setDepart(dep);//员工对象和部门对象就建立了关联
//保存
s.save(dep);
s.save(e1);
s.save(e2);
//提交事务
tx.commit();
return dep;
}finally{
if(s!=null){
s.close();
}
}
}
在我们的main()方法中就可以调用add();这个方法了。