`

第八章Hibernate映射多对一关联关系

阅读更多

第八章Hibernate映射多对一关联关系

  •  多对一单向关联

      1.表与表之间的关联可以分成一对一,一对多,多对一和多对多

      2.网络商城中,一个大的商品分类下,又多个小的商品分类,一个小的商品分类下,又多个商品

 Product类:

public class Product implements java.io.Serializable {
	private Integer id;
	private String name;
	private Double price;
	private String decription;

	public Product() {
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public Double getPrice() {
		return this.price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getDecription() {
		return this.decription;
	}

	public void setDecription(String decription) {
		this.decription = decription;
	}
}

 Category类:

public class Category implements java.io.Serializable {
	private Integer id;
	private String name;
	private String description;
	private Set<Product> products = new HashSet<Product>();
	
	public Category() {
	}

	public Category(String name, String description) {
		this.name = name;
		this.description = description;
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public String getDescription() {
		return this.description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Set<Product> getProducts() {
		return products;
	}

	public void setProducts(Set<Product> products) {
		this.products = products;
	}
}

    Category映射配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Category" table="CATEGORY" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" length="4000" />
        </property>
    	<set name="products">
			<key column="category_id"></key>
			<one-to-many class="com.crazy.Product"/>
    	</set>
    </class>
</hibernate-mapping>

   与Set映射有点儿像

   Product映射配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Product" table="PRODUCT" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="price" type="java.lang.Double">
            <column name="PRICE" precision="6" />
        </property>
        <property name="decription" type="java.lang.String">
            <column name="DECRIPTION" length="2000" />
        </property>
    </class>
</hibernate-mapping>
 
  • 一对多单向关联

      Product与Category是多对一的关系,Product对象维护着Category对象的参考,如果由Category对象维护着多个Product对象的管理,就是一对多单向关联。

Product类:

public class Product implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private Double price;
	private String decription;
	private Category category;
	public Product() {
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public Double getPrice() {
		return this.price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getDecription() {
		return this.decription;
	}

	public void setDecription(String decription) {
		this.decription = decription;
	}

	public Category getCategory() {
		return category;
	}

	public void setCategory(Category category) {
		this.category = category;
	}
}

  Category类:

public class Category implements java.io.Serializable {
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private String description;
	private Set<Product> products = new HashSet<Product>();
	
	public Set<Product> getProducts() {
		return products;
	}

	public void setProducts(Set<Product> products) {
		this.products = products;
	}

	public Category() {
	}

	public Category(String name, String description) {
		this.name = name;
		this.description = description;
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public String getDescription() {
		return this.description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}
 

  Category映射配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Category" table="CATEGORY" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" length="4000" />
        </property>
        
        <set name="products">
        	<key column="category_id"></key>
			<one-to-many class="com.crazy.Product"/>
        </set>
    </class>
</hibernate-mapping>

 Product映射配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Product" table="PRODUCT" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="price" type="java.lang.Double">
            <column name="PRICE" precision="6" />
        </property>
        <property name="decription" type="java.lang.String">
            <column name="DECRIPTION" length="2000" />
        </property>
    </class>
</hibernate-mapping> 
  •  级联(cascade)

       主动方对执行操作时,被关联对象(被动方)是否同步执行同一操作。

<set name="products" cascade="save-update">
        	<key column="category_id"></key>
			<one-to-many class="com.crazy.Product"/>
 </set>

注意:通常来说,在多对一关联和多对多的关联关系中使用级联没有任何意义。级联通常应用在一对多喝一对一的关联中,应用级联可以少写几行代码;否则需要维护级联的操作,需要多写几行代码。同时,cascade属性的save-update是最为常用的。

  • 一对多双向关联  

   Category类:

public class Category implements java.io.Serializable {
	private Integer id;
	private String name;
	private String description;
	private Set<Product> products = new HashSet<Product>();

	public Category() {
	}

	public Category(String name, String description, Set<Product> products) {
		this.name = name;
		this.description = description;
		this.products = products;
	}

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

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

	public String getDescription() {
		return this.description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Set<Product> getProducts() {
		return this.products;
	}

	public void setProducts(Set<Product> products) {
		this.products = products;
	}
}

  Category映射配置:

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Category" table="CATEGORY" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" length="4000" />
        </property>
        <set name="products" inverse="true" cascade="save-update">
            <key>
                <column name="CATEGORY_ID" precision="8" scale="0" />
            </key>
            <one-to-many class="com.crazy.Product" />
        </set>
    </class>
</hibernate-mapping>

  Product类:

public class Product implements java.io.Serializable {
	private Integer id;
	private Category category;
	private String name;
	private Double price;
	private String decription;

	public Product() {
	}

	public Integer getId() {
		return this.id;
	}

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

	public Category getCategory() {
		return this.category;
	}

	public void setCategory(Category category) {
		this.category = category;
	}

	public String getName() {
		return this.name;
	}

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

	public Double getPrice() {
		return this.price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getDecription() {
		return this.decription;
	}

	public void setDecription(String decription) {
		this.decription = decription;
	}
}

    Product映射配置:

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Product" table="PRODUCT" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="200" />
        </property>
        <property name="price" type="java.lang.Double">
            <column name="PRICE" precision="6" />
        </property>
        <property name="decription" type="java.lang.String">
            <column name="DECRIPTION" length="2000" />
        </property>
        
         <many-to-one name="category" class="com.crazy.Category" outer-join="true">
            <column name="CATEGORY_ID" precision="8" scale="0" />
        </many-to-one>
    </class>
</hibernate-mapping>

  在类的表现上是,我中有你,你中有我。

  • 控制反转(Inverse)

      在Hibernate中的一对多的单向或者多向关联的情况下,我们可以将"一"方控制权交给"多"方,称为控制反转。

  <set name="products" inverse="true">
            <key>
                <column name="CATEGORY_ID" precision="8" scale="0" />
            </key>
            <one-to-many class="com.crazy.Product" />
</set>
 

 

分享到:
评论

相关推荐

    hibernate多对多双向关联

    "hibernate_many2many_2"这个文件名可能是指一个关于Hibernate多对多关联的示例或教程的第二部分,可能包含配置文件、Java实体类、映射文件以及相关的测试代码。 **详细知识点:** 1. **实体类定义**:在Hibernate...

    hibernate一对多,多对一,一对多双向关联

    例如,@OneToOne 可用于表示一对一关系,@ManyToOne 和 @OneToMany 用于多对一和一对多关系。 4. **外键约束:** 在数据库层面,这些关联通常通过外键实现。Hibernate允许在映射文件或注解中指定外键的生成策略。 ...

    Hibernate关联关系映射目录

    在多对一连接表单向关联中,多个实体(子实体)与一个实体(父实体)相关联,这种关联通过第三个表(连接表或关联表)来实现。 **表结构示例**: - **Department表**: - `departmentid`: 主键 - `departmentName`...

    Hibernate映射关联详解

    ### Hibernate映射关联详解 #### 一、理解一对多双向关联关系 在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点...

    Hibernate ORM - 一对多双向组合关联关系

    这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与多个子实体相对应,而双向则表示这种关系是相互的,即父实体...

    hibernate关系映射

    **四、Hibernate的多对一关系映射** 多对一关系是多的一方持有一的一方的引用,用`@ManyToOne`注解表示。在多的一方中添加对一的一方的引用,并通过`@JoinColumn`指定引用的列。 **五、Hibernate的多对多关系映射*...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.1 建立多对一的单向关联关系  7.1.1 元素的not-null属性  7.1.2 级联保存和更新  7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联...

    深入浅出Hibernate中文版 part1

    第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...

    Accp6.0 Y2 Hibernate1-2章上机练习和课后代码

    7. **一对多、多对一、多对多关系映射**:在chapter02的实践中,你可能遇到实体类之间的一对多、多对一或者多对多关系。Hibernate提供了多种方式来处理这些关系,例如集合映射、联接表等。 8. **懒加载和立即加载**...

    菜鸟快速运行第一个hibernate

    9. **一对多、多对一、多对多关系映射**:在数据库中,不同表之间的关联关系需要在实体类中通过注解或XML配置来映射,例如@OneToMany、@ManyToOne、@ManyToMany。 10. **延迟加载和级联操作**:Hibernate的延迟加载...

    北大青鸟Y2使用Hibernate开发租房系统8-11章全

    第十章可能会涉及更复杂的查询技巧,如多对一、一对多、多对多等关联关系的处理。Hibernate提供了多种关联映射方式,例如使用@OneToOne、@ManyToOne、@OneToMany和@ManyToMany注解。这一章还会讨论级联操作,使得在...

    深入浅出Hibernate中文版 part2

    第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...

    Hibernate一对一实例子

    本篇将深入探讨 Hibernate 中的一对一映射关系,并通过实例演示如何在SQL2000数据库环境下实现这一功能,同时附带相关的第三方类库。 【描述】详解: 一对一映射是Hibernate中的一种关联关系,它代表两个实体之间...

    北大青鸟7.0Hibernate第七章代码

    “包含数据库表完整的第七章所有知识点”,暗示了这个章节不仅涉及了Hibernate的编程部分,也可能涉及到了数据库设计和表结构的创建,这通常包括实体类的设计、主键的定义、一对多、多对一、一对一和多对多的关系...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     7.1 建立多对一的单向关联关系  7.1.1 元素的not-null属性  7.1.2 级联保存和更新  7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     7.1 建立多对一的单向关联关系  7.1.1 元素的not-null属性  7.1.2 级联保存和更新  7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     7.1 建立多对一的单向关联关系  7.1.1 元素的not-null属性  7.1.2 级联保存和更新  7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联...

    hibernate学习资料大全

    Hibernate 支持各种关联映射,如一对一、一对多、多对一和多对多。理解这些关联关系的建立和查询,能够帮助开发者设计出更灵活的数据模型。 8. **缓存机制**: Hibernate 提供了第一级缓存和第二级缓存,以及查询...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子...

    Hibernate完整ppt教程

    - Hibernate支持List、Set、Map等多种集合类型的映射,以便处理一对多或多对多关系。 8. **缓存机制** - Hibernate的缓存分为第一级缓存(Session缓存)和第二级缓存(可配置的缓存插件,如Ehcache)。 - 缓存...

Global site tag (gtag.js) - Google Analytics