`
周一Monday
  • 浏览: 346785 次
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate4一对多关系映射(自身关联)

阅读更多

示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别。

public class Category  {

	private Integer id;
	private String name;
	private Category parentCategory; // 父类别
	private Set<Category> childCategories = new HashSet<Category>(); // 子类别

	// getter and setter
}

 用XML映射

<hibernate-mapping package="org.monday.hibernate4.domain">
	<class name="Category" table="tbl_category">
		<id name="id">
			<generator class="identity" />
		</id>
		<property name="name" />
		<many-to-one name="parentCategory" class="Category" column="category_id" />
		<set name="childCategories" inverse="true" cascade="all">
			<key column="category_id" />
			<one-to-many class="Category" />
		</set>
	</class>
</hibernate-mapping>

 用@Annotation映射

 

@Entity
@Table(name = "tbl_category")
public class Category  {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String name;

	@ManyToOne
	@JoinColumn(name = "category_id")
	private Category parentCategory; // 父类别

	@OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)
	private Set<Category> childCategories = new HashSet<Category>(); // 子类别

	//getter and setter
}

 

测试代码

                        Category foodCategory = new Category("food");
			Category fruitCategory = new Category("fruit");
			Category vegetableCategory = new Category("vegetable");
			Category appleCategory = new Category("apple");
			Category orangeCategory = new Category("orange");
			Category tomatoCategory = new Category("tomato");

			// 建立食品类别和水果类别之间的关联关系
			foodCategory.getChildCategories().add(fruitCategory);
			fruitCategory.setParentCategory(foodCategory);

			// 建立食品类别和蔬菜类别之间的关联关系
			foodCategory.getChildCategories().add(vegetableCategory);
			vegetableCategory.setParentCategory(foodCategory);

			// 建立水果类别和苹果类别之间的关联关系
			fruitCategory.getChildCategories().add(appleCategory);
			appleCategory.setParentCategory(fruitCategory);

			// 建立水果类别和桔子类别之间的关联关系
			fruitCategory.getChildCategories().add(orangeCategory);
			orangeCategory.setParentCategory(fruitCategory);

			// 建立西红柿类别和蔬菜类别之间的关联关系
			tomatoCategory.setParentCategory(vegetableCategory);
			vegetableCategory.getChildCategories().add(tomatoCategory);

			session.save(foodCategory);

 SQL schema

Hibernate: 
    create table CATEGORYS (
        id integer not null,
        name varchar(255),
        category_id bigint,
        primary key (id)
    )
Hibernate: 
    alter table CATEGORYS 
        add index FK36CF3159B3B4FFA (category_id), 
        add constraint FK36CF3159B3B4FFA 
        foreign key (category_id) 
        references CATEGORYS (id)

 

-----------------------------改进代码---------------------------

 

1.改进实体类

@Entity
@Table(name = "tbl_category")
public class Category {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String name;

	@ManyToOne
	@JoinColumn(name = "category_id")
	private Category parentCategory; // 父类别

	@OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)
	private Set<Category> childCategories = new HashSet<Category>(); // 子类别

	//getter and setter

	/** 添加子类别 */
	public void addChildCategory(Category category) {
		if (category == null) {
			throw new IllegalArgumentException("Can't add a null Category as child.");
		}
		// 删除旧的父类别Category
		if (category.getParentCategory() != null) {
			category.getParentCategory().getChildCategories().remove(category);
		}
		// 设置新的父类别Category
		category.setParentCategory(this);
		// 向当前Category对象中加入子类别
		this.getChildCategories().add(category);
	}
}

 

2.测试代码

// 建立食品类别和水果类别之间的关联关系
			foodCategory.addChildCategory(fruitCategory);

			// 建立食品类别和蔬菜类别之间的关联关系
			foodCategory.addChildCategory(vegetableCategory);

			// 建立水果类别和苹果类别之间的关联关系
			fruitCategory.addChildCategory(appleCategory);

			// 建立水果类别和桔子类别之间的关联关系
			fruitCategory.addChildCategory(orangeCategory);

			// 建立西红柿类别和蔬菜类别之间的关联关系
			vegetableCategory.addChildCategory(tomatoCategory);

			session.save(foodCategory);

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    Hibernate集合映射与关联关系

    本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    Hibernate 关联关系映射分类

    综上所述,Hibernate提供了丰富的关联关系映射机制,包括一对一、一对多和多对多关联,每种关联又可以细分为单向和双向,以及基于主键和基于外键的不同实现方式。正确理解和选择合适的关联关系对于构建高效、可维护...

    Hibernate单向一对多关联映射(XML版)

    在本主题"Hibernate单向一对多关联映射(XML版)"中,我们将深入探讨如何使用XML配置来实现数据库中一个实体类对应多个实体类的关联关系。 在Hibernate中,一对多关联是一种常见的关系映射类型,它反映了数据库中的...

    hibernate(多对多关系映射)

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...

    hibernate单向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...

    hibernate 映射关系学习入门 多对多实体映射

    二、多对多映射关系 在关系数据库中,多对多关系是指两个表之间存在多个对应关系。例如,学生可以选修多门课程,而课程也可以被多名学生选修。在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,...

    hibernate双向多对多关联映射(注解版)

    在这个“hibernate双向多对多关联映射(注解版)”的主题中,我们将深入探讨如何使用Hibernate的注解配置来处理数据库中的双向多对多关联关系。 首先,多对多关联在数据库设计中是指两个实体之间存在多个对应关系,...

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    Hibernate一对多关联映射(注解)

    总结一下,Hibernate的一对多关联映射通过注解方式定义了对象间的关联关系,使得我们在编程时能够以面向对象的方式操作数据,而底层数据库的操作则由Hibernate自动完成。这种方式大大提高了开发效率,同时也降低了...

    hibernate双向一对多关联映射(XML)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...

Global site tag (gtag.js) - Google Analytics