`
lym6520
  • 浏览: 704247 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

实体关系之@OneToMany

SQL 
阅读更多
Order.java
package com.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "Orders")
public class Order implements Serializable {
	
	private Integer orderid;//订单号
	private Float amount;//订单金额
	private Set<OrderItem> orderItems = new HashSet<OrderItem>();//订单项
	private Date createdate;//订单创建日期

	@Id
	@GeneratedValue
	public Integer getOrderid() {
		return orderid;
	}

	public void setOrderid(Integer orderid) {
		this.orderid = orderid;
	}
	
	@Column(name="amount")//name: 映射的列名,如果不指定映射列名,容器默认将属性名称作为的映射的数据库表列名。
	public Float getAmount() {
		return amount;
	}

	public void setAmount(Float amount) {
		this.amount = amount;
	}
	
	/* 
	 * @OneToMany: 指明Order 与OrderItem关联关系为一对多关系
	 * 
	 * mappedBy: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,
	 * 否则可能引起数据一致性的问题。
	 * 
	 * cascade: CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,
	 * 而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order 时将同时删除它所对应的OrderItem对象。
	 * 而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。cascade的值只能从CascadeType.PERSIST(级联新建)、
	 * CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。
	 * 还有一个选择是使用CascadeType.ALL,表示选择全部四项。
	 * 
	 * fatch: 可选择项包括:FetchType.EAGER 和FetchType.LAZY。前者表示关系类(本例是OrderItem类)在主类(本例是Order类)加载的时候
	 * 同时加载;后者表示关系类在被访问时才加载,默认值是FetchType. LAZY。
	 * 
	 */
	@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@OrderBy(value = "id ASC")//注释指明加载OrderItem时按id的升序排序
	public Set<OrderItem> getOrderItems() {
		return orderItems;
	}

	public void setOrderItems(Set<OrderItem> orderItems) {
		this.orderItems = orderItems;
	}
	
	//@Temporal注释用来指定java.util.Date 或java.util.Calendar 属性与数据库类型date,time 或timestamp 中的那一种类型进行映射
	@Temporal(value = TemporalType.TIMESTAMP)
	public Date getCreatedate() {
		return createdate;
	}

	public void setCreatedate(Date createdate) {
		this.createdate = createdate;
	}
	
	/*
	 * 添加订单
	 */
	public void addOrderItem(OrderItem orderitem) {
		if (!this.orderItems.contains(orderitem)) {
			this.orderItems.add(orderitem);
			orderitem.setOrder(this);
		}
	}

	/*
	 * 删除订单
	 */
	public void removeOrderItem(OrderItem orderitem) {
		orderitem.setOrder(null);
		this.orderItems.remove(orderitem);
	}
}


OrderItem.java
package com.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "OrderItems")//name = "OrderItems",表示本实体对应数据库表 OrderItems,可选。
public class OrderItem implements Serializable {
	
	private Integer id;//作为主键
	private String productname;//产品名称
	private Float price;//价格
	private Order order;//对应的订单

	/*
	 * 无参数构造器可别忘了
	 */
	public OrderItem() {
	}
	
	/*
	 * 带参数的构造器,用于初始化实例变量
	 */
	public OrderItem(String productname, Float price) {
		this.productname = productname;
		this.price = price;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

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

	@Column(name="productname")
	public String getProductname() {
		return productname;
	}

	public void setProductname(String productname) {
		this.productname = productname;
	}
	
	@Column(name="price")
	public Float getPrice() {
		return price;
	}

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

	/*
	 * @ManyToOne指明OrderItem和Order之间为多对一关系,多个OrderItem实例关联的都是同一个Order对象。
	 * 其中的属性和@OneToMany基本一样,但@ManyToOne注释的fetch属性默认值是FetchType.EAGER。
	 * 
	 * optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。
	 * 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。
	 * optional 属性的默认值是true。举个例:某项订单(Order)中没有订单项(OrderItem),如果optional 属性设置为false,
	 * 获取该项订单(Order)时,得到的结果为null,如果optional 属性设置为true,仍然可以获取该项订单,但订单中指向订单项的属性为null。
	 * 实际上在解释Order 与OrderItem的关系成SQL时,optional 属性指定了他们的联接关系optional=false联接关系为inner join, 
	 * optional=true联接关系为left join。
	 * 
	 * @JoinColumn:指明了被维护端(OrderItem)的外键字段为order_id,它和维护端的主键(orderid)连接,unique= true 指明order_id列的值不可重复。
	 */
	@ManyToOne(cascade = CascadeType.REFRESH, optional = false)
	@JoinColumn(name = "order_id",referencedColumnName="orderid")
	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}
}
8
1
分享到:
评论
2 楼 s-s-h 2010-07-08  
总结->实践->总结……
1 楼 lym6520 2009-01-09  
@OneToMany
 @OneToMany: 指明Order 与OrderItem关联关系为一对多关系
mappedBy: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果关系是双向的,则将关联的反向(非拥有)一方上的 mappedBy 属性设置为拥有该关系的字段或属性的名称

Order.class
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy(value = "id ASC")//注释指明加载OrderItem时按id的升序排序
public Set<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(Set<OrderItem> orderItems) {
this.orderItems = orderItems;
}

 @ManyToOne指明OrderItem和Order之间为多对一关系,多个OrderItem实例关联的都是同一个Order对象。其中的属性和@OneToMany基本一样,但@ManyToOne注释的fetch属性默认值是FetchType.EAGER。
 解释Order 与OrderItem的关系成SQL时,optional 属性指定了他们的联接关系optional=false联接关系为inner join, optional=true联接关系为left join。
 @JoinColumn:指明了被维护端(OrderItem)的外键字段为order_id,它和维护端的主键(orderid)连接,unique= true 指明order_id列的值不可重复。
OrderItem.class
@ManyToOne(cascade = CascadeType.REFRESH, optional = false)
@JoinColumn(name = "order_id",referencedColumnName="orderid")
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}

相关推荐

    HIBERNATE 一对多 onetomany

    在Hibernate中,这种关系可以通过在实体类中定义`@OneToMany`注解来表示。 **配置实体类** 1. **父实体类**:在这个关系中,"一"端的实体称为父实体。例如,我们用`Student`作为父实体,它有一对多的课程关联。在`...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    onetomany-hibernate

    具体到"onetomany-hibernate"的实现,首先你需要在实体类中定义一对多的关系。这通常通过在父类(“一对一”端)中声明一个集合属性来完成,如`List&lt;ChildEntity&gt; childEntities = new ArrayList();`,并使用`@...

    JPA_OneToMany学习教程

    "JPA_OneToMany"是JPA中的一个关键概念,涉及实体之间的关联关系,特别是在处理一对多关系时。本教程将深入探讨JPA中的OneToMany映射关系,以及如何在实际开发中有效地应用。 1. **OneToMany关系**:在关系数据库中...

    Ejb3-OneToMany--Good.rar

    本知识点将深入探讨EJB3中的`@OneToMany`关系映射,以及与之相关的工具使用。 `@OneToMany`是JPA中的一个注解,它用于表示一对多的关系,即一个实体类可以关联多个其他实体类实例。这种关系在数据库中通常对应一个...

    Hibernate- oneToMany using annotation

    在Java的持久化框架Hibernate中,`@OneToMany`注解是用于表示一对多关系的,这种关系常见于数据库设计中的父表与子表之间。在这个主题中,我们将深入探讨如何在实体类中使用`@OneToMany`注解以及其在实际项目中的...

    Hibernate one to many(many to one) 配置

    在Hibernate中,可以通过`@OneToMany`注解在Java类中表示这种关系,同时在映射文件中配置关联。 3. **Many-to-One关联** Many-to-One是另一个常见的关联类型,它表示多个实体可以关联到一个单一的实体。例如,员工...

    Hibernate 注解一对多,多对一

    `@OneToMany`注解用于表示一个实体类(父类)与另一个实体类(子类)之间的一对多关系,即一个父类实例可以拥有多个子类实例。例如,一个部门可以有多名员工,部门是父类,员工是子类。 配置`@OneToMany`时,需要...

    jpa的实体映射关系7种

    这种关系中,一个实体可以有多个其他实体与之关联,但被关联的实体并不知道这个关系。通过`@OneToMany`注解来表示,可使用`mappedBy`属性定义关联的集合属性。 4. **双向一对多**: 双向一对多关系中,一方实体...

    Hibernate注释

    在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,被广泛应用于数据库操作与实体类映射之中。本文将深入探讨Hibernate中一对多关系的处理方式,重点讲解`@OneToMany`注解的使用方法及其在实际项目...

    JPA课程manyToMany OneToMany 等全部测试

    `@OneToMany`注解表示一个实体可以与另一个实体的一组实例相关联,即一对多的关系。例如,一个部门有多个员工。在JPA中,我们可以这样设置: ```java @Entity public class Department { @OneToMany(mappedBy = ...

    ejb.rar_EJB onetomany_ejb

    在EJB中,`OneToMany`关系是一种常见的实体关系映射,它表示一个实体类与另一个实体类之间的一对多关联。 ### 1. EJB概述 EJB是Java EE(Java Platform, Enterprise Edition)的一部分,它提供了一种标准的方式来...

    hibernate注解处理映射关系共14页.pdf.zip

    Hibernate作为Java领域广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作,通过注解方式,可以更直观、简洁地定义实体类与数据库表之间的映射关系。 1. Hibernate注解基础:Hibernate提供了多种注解,如@...

    jpa--10.单向一对多

    在JPA中,单向一对多关系通常通过在多方实体上定义`@ManyToOne`注解,而在一方实体上定义`@OneToMany`注解来实现。`@OneToMany`注解用于一方实体,表示这个实体拥有多方实体的集合。而`@ManyToOne`注解则用在多方...

    Hibernate对象关系详解

    多对一关系与一对多关系相反,即多个实体对应一个实体。例如,多个订单可以属于一个客户。在Hibernate中,`@ManyToOne`注解用于多方实体,`@OneToMany`用于一方实体。多对一关系的配置与一对多关系类似,只是角色...

    hibernate的多种映射关系

    这种关系意味着一个实体可以与多个其他实体相关联,例如一个部门有多个员工。在 Java 中,这通常通过在父类使用 `@OneToMany` 注解,并在子类使用 `@ManyToOne` 注解实现。`@JoinColumn` 用于定义外键列,而 `@...

    hibernate实体系注解

    本教程将深入探讨如何在Hibernate中使用注解来实现实体类的配置,特别是关注一对多和多对一的关系映射。 **一、Hibernate注解基础** 在Hibernate 3.2之后,引入了注解支持,使得开发者不再需要XML配置文件来定义...

    demo-onetomany-nosql:与OneToMany关系中的MongoDB的Spring Data演示项目

    标题中的“demo-onetomany-nosql”指的是一个演示项目,主要展示了在非关系型数据库(NoSQL)环境中,特别是在MongoDB中处理一对一到多(OneToMany)关系的方法。Spring Data是Spring框架的一个模块,它提供了与各种...

    HIbernate-OneToMany:HIbernate-OneToMany Annotations 在实体之间具有 PKFK 关系

    在Java的持久化框架Hibernate中,一对一(OneToOne)、一对多(OneToMany)和多对多(ManyToMany)的关系映射是常见的实体关联方式。本篇文章将深入探讨标题中提到的"一对一"(OneToMany)注解在实体之间的主键外键...

Global site tag (gtag.js) - Google Analytics