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); } }
相关文章推荐
- ToolStripSplitButton单选设置
- 计算机存储单位以及内存原理
- 二进制、八进制、十进制、十六进制之间转换
- mycncart1.0.2.0版 发布
- Python实现打印二叉树某一层的所有节点
- 黑马程序员------多线程创建的3种方式
- Linux运维 第三阶段 (七) nginx(1)
- 贵州四儿童事件记
- 【C++ Primer Plus 9.2】 存储持续性、作用域和链接性
- centos7 和 win7 双系统 分别装在两个不同的硬盘
- 有关11g新特性ENABLE_DDL_LOGGING 初始化参数
- Delphi XE8中Delphi和JAVA数据类型对应关系!
- SVN-Previous operation has not finished; run 'cleanup' if it was interrupted
- Delphi XE8中Delphi和JAVA数据类型对应关系!
- Delphi XE8中Delphi和JAVA数据类型对应关系!
- hdu 1425 sort
- hdu 1234 开门人和关门人
- IO的多路复用和信号驱动
- 2015061309 - 推荐李公子博客
- linux 进程基础(四)