`

hibernate自身双向一对多 (链表结构对象)

阅读更多
摘自 [圣思园hibernate 017. 自身双向一对多关联关系深入解析]




数据库Schema: (Oracle)
create table test_categories(
ID number(15) not null,
name varchar2(15),
category_id number(15),
primary key (id)
);

alter table categories add index idx_category_id
(category_id), add constraint
fk_category_id foreign key (category_id) references
categories(id);



public class Category
{
	

	private Long id;
	
	private String name;
	
	private Category parentCategory;
	
	private Set<Category> childCategories;
	
	public Category()
	{
		// TODO Auto-generated constructor stub
	}
	
	public Category(String name, Category parentCategory,
			Set<Category> childCategories)
	{
		this.name = name;
		this.parentCategory = parentCategory;
		this.childCategories = childCategories;
	}
}


这里Category类实现了自身的一对多, 每一个Category有一个父表和若干的字表。
父表是它上一层的类, 比如CPU的父类表是电脑硬件,
而CPU的子类表可以是intel cpu和 amd cpu. (双向就是指向父类和向子类)
表的结构关联如下:






=========================具体实例====================

这里我们用一个计算机硬件的分类来演示这个自身双向一对多。
结构图:




Category.hbm.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
          
  <hibernate-mapping package="com.lj.zhang.category">
  	<class name="Category" table="test_category" lazy="false">
  			<id name="id" column="id" type="long">
  				<generator class="sequence">
  					<param name="sequence">cate_seq</param>
  				</generator>
  			</id>
  			 <property name="name" column="name" type="string"/>
  			
  		<set name="childCategories" cascade="all" inverse="true">
  			<key column="category_id"></key>
  			<one-to-many class="com.lj.zhang.category.Category"/>
  		</set>
  		 
		<many-to-one name="parentCategory" class="com.lj.zhang.category.Category" column="category_id"></many-to-one>
  			
  	</class>
  
  
  </hibernate-mapping>
          
          

     

hibernate代码:

Session session = HibernateUtil.openSession();
		
		Transaction tx = null;

		tx = session.beginTransaction();
		
		
		Category c=new Category("computer",null,new HashSet<Category>());
		
		
		//这里没有通过cpu.setParent来指定父类, 而是直接在构造函数里将父类实例传递进去,下面都是这样。
		//setParent也可以实现同样效果。
		Category cpu=new Category("cpu",c,new HashSet<Category>());
		Category motherboard=new Category("motherboard",c,new HashSet<Category>());
	 	
		
		c.setChildCategories(ArraysHelper.asSet(cpu,motherboard));
		
		
		
 		Category intel_cpu=new Category("intel_cpu",cpu,new HashSet<Category>());
 		Category amd_cpu=new Category("amd_cpu",cpu,new HashSet<Category>());
 		cpu.setChildCategories(ArraysHelper.asSet(intel_cpu,amd_cpu));
 		
 		
 		Category asus=new Category("asus",motherboard,new HashSet<Category>());
 		Category giga=new Category("giga",motherboard,new HashSet<Category>());
 		motherboard.setChildCategories(ArraysHelper.asSet(asus,giga));
 		
 		
		
	 
		session.save(c);

		tx.commit();
		
		session.close();


注意这里是通过oracle的sequence来给id赋值:
<id name="id" column="id" type="long">
  				<generator class="sequence">
  					<param name="sequence">cate_seq</param>
  				</generator>
  			</id>


通过该程序可以看到, 只要把这些类的实例通过java的方式赋值,最后save它们的最高级的父类对象, 所有的对象都会被存储到数据库中, 并建立对应关系。
个人感觉Hibernate对于Java程序员的便利性在这个例子中得到充分体现。






------------------------------
数据库里显示最高级父类的cate id是没有任何数值的, 我们可以设置oracle给这种情况一个-1.
不过这里再次执行发现还是什么都没有。因为要在hibernate那里设置一下。

找到category.hbm.xml


  • 大小: 80.5 KB
  • 大小: 54 KB
  • 大小: 51.8 KB
  • 大小: 25 KB
分享到:
评论

相关推荐

    Hibernate常见面试题

    ### 映射一对多双向关联关系时设置SET元素 - 应在`set`元素中设置`cascade`属性,用于级联保存、更新和删除操作。 - 可以使用`inverse`属性指定一方负责维护关系。 ### List的主要实现类及其特点 - **LinkedList*...

    javaweb方向面试宝典

    8. **一对多双向关联的级联操作**: - 在set元素中设置`cascade`属性,如`cascade="save-update,delete"`,可避免重复SQL语句,实现级联保存、更新和删除。 9. **集合实现类**: - LinkedList:链表结构,插入和...

    大全面试资源,选择题,笔试题,技术等等.doc

    - 在双向一对多关联的 SET 元素中,设置 `cascade` 属性进行级联保存、更新和删除,避免冗余 SQL。 9. **集合实现类**: - **LinkedList**:基于链表的数据结构,适合于插入和删除操作。 - **ArrayList**:基于...

    Java集合实例

    5. 将集合类中的对象与数据库关联,例如,实体类的属性可以是Set或List类型,映射到数据库的多对一或一对多关系。 在"Collection_Set"文件中,你可以找到如何使用Java集合配合Hibernate操作数据库的具体实例,通过...

    java程序员面试题(银河创想).pdf,这是一份不错的文件

    LinkedList基于双向链表,插入和删除速度快,但随机访问效率低,因为需要遍历链表。 5.String与StringBuffer的区别:String是不可变对象,每次修改都会创建新对象,而StringBuffer是线程安全的可变对象,适合在多...

    Java 亚信上海 面试题

    - 可能涉及双向链表或循环链表等复杂结构。 **Singleton模式与Factory模式:** - **Singleton模式**: - 确保一个类只有一个实例,并提供一个全局访问点。 - 实现方式包括懒汉式、饿汉式等。 - 考虑线程安全性...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    主要实现有`ArrayList`(基于数组)、`LinkedList`(基于双向链表)。 - **Set**:不允许重复元素的集合。主要实现有`HashSet`(基于哈希表)、`TreeSet`(基于红黑树)。 - **接口与实现**: - `List`接口的主要...

    大数据面试复习----常问问题分析.docx

    在大数据面试中,Java技术是不可或缺的一部分,它涉及到虚拟机、面向对象、多线程、集合框架、反射、内存管理等多个方面。以下是一些相关知识点的详细解释: 1. **HashMap底层原理**:HashMap是基于哈希表实现的,...

    整理的Java-EE面试总结.pdf

    这份名为《整理的Java-EE面试总结.pdf》的文档是一份关于Java基础面试知识点的总结,内容涉及了多个在面试中常见的问题和概念,以及它们的区别和使用场景。根据提供的文件信息,下面将详细解读其中的关键知识点。 ...

    这是一篇对java八股文的详细介绍的文章

    - **目的**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 #### 六、Spring框架 1. **IoC** - **概念**:Inversion of Control,反转控制,通过...

    东南融通面试题 内部

    - Hibernate负责对象关系映射,实现对数据库的操作。 - 两者通过Spring管理事务、配置环境等方式进行整合。 #### Spring框架 1. **Spring中FactoryBean与BeanFactory的区别:** - `BeanFactory`是Spring的核心...

    面试经验资料

    - **O/R Mapping**:对象关系映射是将对象模型与关系型数据库模型相互转换的技术,如Hibernate实现了这一过程,提高了开发效率。 - **左外连接与右外连接**:SQL中的左外连接保留左表所有记录,即使右表没有匹配;右...

    JAVA工程师面试题

    LinkedList基于双向链表,适合频繁插入和删除。 3. Error是严重问题,如系统级错误,无法恢复,而Exception是程序运行时的异常,可以通过try-catch捕获处理。 4. Abstract class可以有方法实现,可以被继承;...

    美团校园招聘历年经典面试题汇总:后台开发岗1

    以上只是部分题目涉及的知识点,面试中还会涉及到Volatile的作用、Synchronized的不同用法、面向对象特性、线程池原理、数据库设计、ACID原则、Hibernate优缺点、Java虚拟机内存结构、垃圾收集器、TCP/IP协议栈、...

    JAVA相关基础知识

    - **LinkedList**使用双向链表结构,插入和删除操作更快,但按索引访问较慢。 5. **Enterprise JavaBeans (EJB)**: - EJB是Java企业级应用开发的重要组成部分,基于Java EE(Java Platform, Enterprise Edition...

    java 数据集工具

    9. **ORM框架**:对象关系映射(ORM)框架如Hibernate和MyBatis简化了Java与数据库之间的交互,将数据操作转化为对象操作。 10. **数据序列化与反序列化**:Java的`java.io.Serializable`接口使得对象可以被序列化,...

Global site tag (gtag.js) - Google Analytics