`
mzhj
  • 浏览: 227543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

10、JPA中的一对多双向关联与级联操作(一对多关系:一)

阅读更多


Order.java

package cn.itcast.bean;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Order {
	private String orderId;
	private Float amount = 0f;
	private Set<OrderItem> items = new HashSet<OrderItem>();

	@Id      //要注意:目前JPA规范并没有提供UUID这种生成策略,目前主键值只提供了整型的生成方式,所以@GeneratedValue这个注解就不能在这里用上,不能对字符串进行id自增长。
	@Column(length = 12)
	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	@Column(nullable = false)
	public Float getAmount() {
		return amount;
	}

	public void setAmount(Float amount) {
		this.amount = amount;
	}

	@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,
			CascadeType.MERGE, CascadeType.REMOVE })	//设置成一对多的关系。
	public Set<OrderItem> getItems() {
		return items;
	}

	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
}

 

OrderItem.java

package cn.itcast.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class OrderItem {
	private Integer id;
	private String productName;
	private Float sellPrice = 0f;	//默认值为0。
	private Order order;

	@Id
	@GeneratedValue	//id自增长方式生成主键。
	public Integer getId() {
		return id;
	}

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

	@Column(length = 40, nullable = false)
	public String getProductName() {
		return productName;
	}

	public void setProductName(String productName) {
		this.productName = productName;
	}

	@Column(nullable = false)
	public Float getSellPrice() {
		return sellPrice;
	}

	public void setSellPrice(Float sellPrice) {
		this.sellPrice = sellPrice;
	}

	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}
}

 



   在JPA里面,一对多关系(1-n):
   多的一方为关系维护端,关系维护端负责外键记录的更新(如果是条字段就负责字段的更新,如果是多对多关系中的中间表就负责中间表记录的更新),关系被维护端是没有权力更新外键记录(外键字段)的。


CascadeType的选项有,看图:

 


     CascadeType.REFRESH:级联刷新,也就是说,当你刚开始获取到了这条记录,那么在你处理业务过程中,这条记录被另一个业务程序修改了(数据库这条记录被修改了),那么你获取的这条数据就不是最新的数据,那你就要调用实体管理器里面的refresh方法来刷新实体,所谓刷新,大家一定要记住方向,它是获取数据,相当于执行select语句的(但不能用select,select方法返回的是EntityManager缓存中的数据,不是数据库里面最新的数据),也就是重新获取数据。
     CascadeType.PERSIST:级联持久化,也就是级联保存。保存order的时候也保存orderItem,如果在数据库里已经存在与需要保存的orderItem相同的id记录,则级联保存出错。
     CascadeType.MERGE:  级联更新,也可以叫级联合并;当对象Order处于游离状态时,对对象Order里面的属性作修改,也修改了Order里面的orderItems,当要更新对象Order时,是否也要把对orderItems的修改同步到数据库呢?这就是由CascadeType.MERGE来决定的,如果设了这个值,那么Order处于游离状态时,会先update order,然后for循环update orderItem,如果没设CascadeType.MERGE这个值,就不会出现for循环update orderItem语句。
     所以说,级联更新是控制对Order的更新是否会波及到orderItems对象。也就是说对Order进行update操作的时候,orderItems是否也要做update操作呢?完全是由CascadeType.MERGE控制的。
     CascadeType.REMOVE:当对Order进行删除操作的时候,是否也要对orderItems对象进行级联删除操作呢?是的则写,不是的则不写。

    如果在应用中,要同时使用这四项的话,可以改成cascade = CascadeType.ALL

     应用场合问题:这四种级联操作,并不是对所有的操作都起作用,只有当我们调用实体管理器的persist方法的时候,CascadeType.PERSIST才会起作用;同样道理,只有当我们调用实体管理器的merge方法的时候,CascadeType.MERGE才会起作用,其他方法不起作用。    同样道理,只有当我们调用实体管理器的remove方法的时候,CascadeType.REMOVE才会起作用。
     注意: Query query = em.createQuery("delete from Person o where o.id=?1");这种删除会不会起作用呢?是不会起作用的,因为配置里那四项都是针对实体管理器的对应的方法。

 

  • 大小: 35.8 KB
分享到:
评论

相关推荐

    JPA中的一对多双向关联与级联操作

    这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...

    JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi

    JPA中的多对多双向关联实体定义与注解设置

    总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...

    13_jpa多对多双向关联实体定义与注解

    在Java世界中,Java Persistence API(JPA)是Oracle公司推出的用于...通过"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置"的学习,开发者可以更好地应用这些概念,提升代码质量和数据库操作的灵活性。

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...

    12_JPA详解_JPA中的一对一双向关联.zip

    在Java世界中,Java Persistence API(JPA)是用于管理和持久化对象的规范,它使得开发者可以方便地在...在实际项目中,结合其他关联类型,如一对多、多对一、多对多,可以构建出更加灵活、符合业务逻辑的数据模型。

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    总结来说,JPA中的多对多双向关联提供了一种灵活的方式来处理实体间的复杂关系。正确理解和使用这些关系操作,可以帮助开发者构建出高效且易于维护的Java应用程序。在实际开发中,应根据需求选择合适的关联类型和...

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

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    Hibernate annotation JPA 一对多,多对多

    同时,还需要在`Teacher`类中添加一个`List&lt;Student&gt;`字段,用`@OneToMany`注解来实现一对多关系,形成双向关联。 3. **多对多关系**: 学生和班级的关系可以是多对多,因为一个学生可以属于多个班级,反过来,一...

    jpa--11.双向一多

    **JPA 双向一对多关系详解** 在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有...

    JPA实体关联(hibernate实现)

    一对多关联意味着一个实体可以与多个其他实体相关联。例如,一个学生可以有多个课程。在JPA中,我们使用`@OneToMany`注解来定义这种关系。默认情况下,关联是不级联的,可以通过`cascade=CascadeType...`来指定级联...

    jpa的实体映射关系7种

    双向一对多关系中,一方实体可以拥有多个另一方实体,而另一方实体也知晓这个关系。双方都需要使用`@OneToMany`和`@ManyToOne`注解来定义关系,且`mappedBy`应设置在`@OneToMany`的一侧。 5. **双向多对一**: 相...

    传智播客JPA学习笔记.pdf

    JPA中的一对多双向关联与级联操作(一对多关系:一)** 在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 *...

    jpa 关联映射jpa 关联映射jpa 关联映射

    通过以上示例,我们了解了如何在 JPA 中定义实体之间的关联关系,并且学习了如何使用 `@ManyToOne`、`@JoinColumn`、`@OneToMany` 等注解来描述实体之间的多对一和一对多关系。此外,还讨论了级联操作 (`cascade`) ...

    jpa--10.单向一对多

    在Java Persistence API (JPA) 中,"单向一对多"是一种常见的关系映射类型,它代表了数据库中两个实体间的一种关联。这种关联意味着一个实体(“一方”)可以与多个其他实体(“多方”)相关联,而反过来,多方并不...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    2. **一对多(OneToMany)**: 一个实体可以与多个其他实体相关联,如一个班级有多个学生。使用`@OneToMany`注解,可以设置`fetch`策略(默认为`LAZY`,表示延迟加载)和`cascade`属性(如`CascadeType.ALL`,表示...

Global site tag (gtag.js) - Google Analytics