`

hibernate(3):hibernate映射关系

 
阅读更多

 

 

例:建表脚本

create table customers(
    id bigint not null,
    name varchar(15),
    primary key (id)
)

create table orders(
    id bigint not null,
    order_number varchar(15),
    customer_id bigint not null,
    primary key(id)
)

alter table orders add index idx_customer_id(customer_id),add constraint fk_customer_id 
foreign key(customer_id) references customers(id);

 

Customer.java

package com.hibernate.model;

import java.util.Set;

public class Customer {
	private Long id;
	private String name;
	private Set orders;
	
	public Customer(String name,Set orders){
		this.name = name;
		this.orders = orders;
	}
	
	public Customer(){
	}
	
	public Customer(Set orders){
		this.orders = orders;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set getOrders() {
		return orders;
	}

	public void setOrders(Set orders) {
		this.orders = orders;
	}
	
}

 

Order.java

package com.hibernate.model;

public class Order {
	private Long id;
	private String orderNumber;
	private Customer customer; // 多对一,通过该变量可以引用到对应的Customer

	public Order(String orderNumber, Customer customer) {
		this.orderNumber = orderNumber;
		this.customer = customer;
	}
	
	public Order(){
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getOrderNumber() {
		return orderNumber;
	}

	public void setOrderNumber(String orderNumber) {
		this.orderNumber = orderNumber;
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
}

 

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Customer" table="customers">
		<id name="id" column="id" type="long">
			<generator class="increment"></generator>
		</id>
		<property name="name" type="string">
			<column name="name" length="15"></column>
		</property>
		<!--cascade表示保存或更新customers对象时,会同步保存或更新与之关联的orders对象 -->
		<!-- 因为Customer类中的orders属性是set类型的,所以下面这样用 -->
		<!-- inverse为true表示由对方来维护关联关系 -->
		<set name="orders" cascade="save-update" inverse="true">
			<key column="customer_id"></key><!-- key元素设定与所关联的持久化类对应的表单外键-->
			<one-to-many class="com.hibernate.model.Order"/>
		</set>	
	</class>
</hibernate-mapping>

 

Order.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Order" table="orders">
		<id name="id" column="id" type="long">
			<generator class="increment"></generator>
		</id>
		<property name="orderNumber" type="string">
			<column name="order_number" length="15"></column>
		</property>
		<many-to-one name="customer" column="customer_id" class="com.hibernate.model.Customer">
		</many-to-one>
	</class>
</hibernate-mapping>

在hibernate.cfg.xml文件中加上上面这两个配置文件的映射

<mapping resource="Customer.hbm.xml"></mapping>
<mapping resource="Order.hbm.xml"></mapping>

  

测试

package com.hibernate.util;

import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.model.Customer;
import com.hibernate.model.Order;

public class Test {
	public static void main(String[] args) {
		saveCustomerAndOrderWithCascade();
	}

	public static void saveCustomerAndOrderWithCascade() {
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			Customer customer = new Customer("zhangsan", new HashSet());

			Order order1 = new Order();
			order1.setOrderNumber("zhangsan_order1");
			order1.setCustomer(customer);

			Order order2 = new Order();
			order2.setOrderNumber("zhangsan_order2");
			order2.setCustomer(customer);

			Order order3 = new Order();
			order3.setOrderNumber("zhangsan_order3");
			order3.setCustomer(customer);

			customer.getOrders().add(order1);
			customer.getOrders().add(order2);
			customer.getOrders().add(order3);
			//只需要customer,与其关联的order都会被保存
			session.save(customer);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
}

 

 

 

 

 

建表脚本

create table categories(
    id bigint not null,
    name varchar(15),
    category_id bigint,
    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)

 

Category.java

package com.hibernate.model;

import java.util.Set;

public class Category {
	private Long id;
	private String name;
	private Category parentCategory;
	private Set childCategories;
	
	public Category(String name,Category parentCategory,Set childCategories){
		this.name = name;
		this.parentCategory = parentCategory;
		this.childCategories = childCategories;
	}
	
	public Category(){}
	
	public Category(Set childCategories){
		this.childCategories = childCategories;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Category getParentCategory() {
		return parentCategory;
	}

	public void setParentCategory(Category parentCategory) {
		this.parentCategory = parentCategory;
	}

	public Set getChildCategories() {
		return childCategories;
	}

	public void setChildCategories(Set childCategories) {
		this.childCategories = childCategories;
	}
}

 

Category.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.hibernate.model.Category" table="categories">
		<id name="id" column="id" type="long">
			<generator class="increment"></generator>
		</id>
		<property name="name" type="string">
			<column name="name" length="15"></column>
		</property>
		<set name="childCategories" cascade="all" inverse="true">
			<key column="category_id"></key>
			<one-to-many class="com.hibernate.model.Category"/>
		</set>	
		<many-to-one name="parentCategory" column="category_id" class="com.hibernate.model.Category">
		</many-to-one>		
	</class>
</hibernate-mapping>

 

级联保存与级联删除

public static void saveCategoryWithCascade(){
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try{
			tx = session.beginTransaction();
			//食品分类
			Category foodCategory = new Category("food",null,new HashSet());
			//蔬菜分类
			Category vegetableCategory = new Category("vegetable",null,new HashSet());
			//水果分类
			Category fruitCategory = new Category("fruit",null,new HashSet());
			//西红柿分类
			Category tomotaCategory = new Category("tomota",null,new HashSet());
			//苹果分类
			Category appleCategory = new Category("apple",null,new HashSet());
			//桔子分类
			Category orangeCategory = new Category("orange",null,new HashSet());
			
			//设置上下级关系
			foodCategory.getChildCategories().add(vegetableCategory);  //食品与蔬菜
			vegetableCategory.setParentCategory(foodCategory);
			
			foodCategory.getChildCategories().add(fruitCategory);  //食品与水果
			fruitCategory.setParentCategory(foodCategory);
			
			vegetableCategory.getChildCategories().add(tomotaCategory);//蔬菜与西红柿
			tomotaCategory.setParentCategory(vegetableCategory);
			
			fruitCategory.getChildCategories().add(appleCategory);  //水果与苹果
			appleCategory.setParentCategory(fruitCategory);
			
			orangeCategory.getChildCategories().add(orangeCategory);  //水果与桔子
			orangeCategory.setParentCategory(fruitCategory);
			session.save(foodCategory);  //级联保存所有的关联对象
			tx.commit();
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
	
	//级联删除
	public static void deleteCategoryWithCascade(){
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try{
			tx = session.beginTransaction();
			Category category = (Category) session.get(Category.class, new Long(1));
			session.delete(category);
			tx.commit();
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

 

分享到:
评论

相关推荐

    Hibernate教程20_关系映射案例三

    【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...

    curso-hibernate:Hibernate示例

    内容:hibernate001:通过 XML 配置的基本示例 hibernate002:通过注释配置的基本示例 hibernate003:会话方法练习 hibernate004:组件使用示例 hibernate005:单向关系映射示例 hibernate006:双向关系映射示例 ...

    Hibernate对象关系映射

    Hibernate对象关系映射一对多 很基础等文档

    Hibernate教程09_关系映射之组件映射

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射中的组件映射。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它允许开发人员以面向对象的方式处理数据库操作,极大地简化了数据层...

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

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    Beginning Hibernate: For Hibernate 5

    - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**: 本书针对 Hibernate 5.0 版本进行了更新和介绍,这是在 Java 社区中广泛使用的最新版本...

    Hibernate初之单表映射学习例子

    Hibernate是Java开发中一个流行的对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,而无需过多关注SQL的细节。"初之"暗示了这是面向初学者的内容,主要会讲解如何配置和使用Hibernate进行简单的...

    Hibernate的关联关系映射图解

    Hibernate4中映射关系图解。

    Hibernate_关联关系映射配置详解

    Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者

    Hibernate关系映射

    **标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...

    Hibernate案例:办公自动系统

    Hibernate 是一款强大的开源对象关系映射(ORM)框架,它为Java开发者提供了数据持久化的解决方案,极大地简化了数据库操作。在这个名为“办公自动系统”的案例中,我们可以深入理解Hibernate的核心概念和实际运用。...

    精通Hibernate:Java对象持久化详解.zip

    Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    JAVA数据类型与Hibernate的类型映射

    此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...

    Hibernate映射关系配置:XML方式和注解方式

    标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    此外,Hibernate3提供了强大的关联映射功能,如一对一、一对多、多对一和多对多关系,使得处理复杂的数据库关系变得简单。 总的来说,Hibernate3是一个功能强大的ORM工具,简化了Java应用程序与数据库的交互,提高...

Global site tag (gtag.js) - Google Analytics