您的位置:首页 > 其它

Hibernate 双向的自身关联映射

2015-06-14 00:00 344 查看
双向的多对一(一对多)关系映射
对象模型:
一端:添加对多端对象集合的引用
多端:添加对一端对象的引用
关系模型:
一端:没有变化
多端:添加对一端主键的引用(建立外键关系)

关系映射文件hbm.xml的配置
在一端
<bag name="orderList">
<!-- 用key元素指定关联的外键列 -->
<key  column="account_id" />
<!-- 用one-to-many元素关联到多端的实体类 -->
<one-to-many  class="com.tjitcast.model.Order" />
</bag>

在多端
<!-- 在多端配置多对一得关联映射
在双向的多对一(一对多)关系映射中要保证引用的外键列名一致
-->
<many-to-one name="account" column="account_id"/>

注意:
建议在双向一对(多对一中)把关系交给多的一端来维护
inverse="true":反转关联关系的维护权
在一对多双向关联中,为了提高Hibernate的执行效率,应该把关系维护权交给多端。
不会影响数据的关联查询。

package model;

import java.util.Set;

/**
* @author sally
* 双向的一对多或多对一 自身关联
*/
public class Category {

private int id;
private String name;
//如果把Category看成是多的一端
private Category parent;
//如果把Category看成是少的一端,则需要对多的一端进行对象集合的引用
private Set<Category> clist;

public Category(){

}

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 Category getParent() {
return parent;
}

public void setParent(Category parent) {
this.parent = parent;
}

public Set<Category> getClist() {
return clist;
}

public void setClist(Set<Category> clist) {
this.clist = clist;
}

}

<?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>
<!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
<class name="model.Category" table="cate_tab">
<!-- type指明当前字段的类型    name对应实体中的属性名 -->
<id type="integer" name="id">
<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
<generator class="native"/>
</id>
<property name="name" type="string"></property>
<set name="clist" inverse="true">
<key column="parent_id"></key>
<!-- 配置一对多的关联映射 -->
<one-to-many class="model.Category"/>
</set>
<many-to-one name="parent" column="parent_id"></many-to-one>

</class>
</hibernate-mapping>

<!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="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///2o2mzishen</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.show_sql">true</property>
<!-- 其它属性配置 -->
<!-- 指明C3P0的提供者 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 连接池参数的配置 -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>

<!-- 打印SQL语句到控制台 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 注册实体的对象关系映射文件 -->

<mapping resource="model/Category.hbm.xml"/>

</session-factory>
</hibernate-configuration>

package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

private static SessionFactory factory;
static{
factory=new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getFactory(){
return factory;
}

public static Session getSession(){
return factory.openSession();
}

public static void close(Session session){
if(session!=null){
session.close();
}

}

}

package test;

import model.Category;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import util.HibernateUtils;

public class O2mTest {

@Test
public void createTable(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
se.create(true, true);
}
/**
* 先添加多的一端,再添加少的一端
*/
@Test
public void save(){
Session session=HibernateUtils.getSession();
Transaction ts=session.beginTransaction();

//添加一级分类
Category c1=new Category();
c1.setName("计算机");
session.save(c1);

//添加二级分类
Category c2=new Category();
c2.setName("软件开发");
c2.setParent(c2);
session.save(c2);

//添加二级分类
Category c3=new Category();
c3.setName("硬件维修");
c3.setParent(c3);
session.save(c3);

ts.commit();
HibernateUtils.close(session);
}
/**
* 先添加少的一端,再添加多的一端
*/
@Test
public void save1(){
Session session=HibernateUtils.getSession();
Transaction ts=session.beginTransaction();

ts.commit();
HibernateUtils.close(session);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: