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

jpa级联操作详解4-级联更新(CascadeType.MERGE)

阅读更多

在jpa的应用中级联更新相比其他的不是很常用,但是也很有了解的必要

在这一讲的例子中我们依然以车库和汽车做实体类

Garage.java

package com.hibernate.jpa.bean1;

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;
@Entity
public class Garage {

	/**
	 * many to one jpa 多对一 hibernate实现
	 */
	private Integer gid;
	private String garagenum;
	private Set<Auto> autos = new HashSet<Auto>();
	
	@Id @GeneratedValue
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	@Column(length=20)
	public String getGaragenum() {
		return garagenum;
	}
	public void setGaragenum(String garagenum) {
		this.garagenum = garagenum;
	}
	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
        // CascadeType.PERSIST: 级联保存
	public void setAutos(Set<Auto> autos) {
		this.autos = autos;
	}
	public void addGarageAuto(Auto auto) {
		auto.setGarage(this);
		this.autos.add(auto);
	}

}

Auto.java

package com.hibernate.jpa.bean1;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Auto {

	/**
	 * one to many jpa 一对多关联 hibernate实现
	 */
	private Integer autoId;
	private String autotype;
	private String autonum;
	private Garage garage;

	@Id @GeneratedValue
	public Integer getAutoId() {
		return autoId;
	}
	public void setAutoId(Integer autoId) {
		this.autoId = autoId;
	}
	public String getAutotype() {
		return autotype;
	}
	public void setAutotype(String autotype) {
		this.autotype = autotype;
	}
	public String getAutonum() {
		return autonum;
	}
	public void setAutonum(String autonum) {
		this.autonum = autonum;
	}
	@ManyToOne(cascade={CascadeType.REMOVE,CascadeType.REFRESH})
	@JoinColumn(name="garageid")
	public Garage getGarage() {
		return garage;
	}
        // CascadeType.REMOVE:级联删除 ;  CascadeType.REFRESH:级联刷新 
	public void setGarage(Garage garage) {
		this.garage = garage;
	}

}

单元测试方法

	@Test public void update() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Garage garage = em.find(Garage.class, 1);
		garage.setGaragenum("RoomAA");
		
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

运行观察

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: update Garage set garagenum=? where gid=?

 

(二)添加CascadeType.MERGE注解          //// CascadeType.MERGE 级联合并

	@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}

将单元测试方法中的

garage.setGaragenum("RoomAA");

改一下

garage.setGaragenum("RoomBB");

运行update()

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: update Garage set garagenum=? where gid=?

可见,这与上次发出的sql语句是一样的

 

2
0
分享到:
评论
2 楼 xiechao240 2011-04-12  
不知道你想要表达什么, 别人是想看看CascadeType.MERGE 这个的用法
1 楼 zaymg 2010-01-23  
[img]
引用
[u][/u]
[/
]

相关推荐

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

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

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

    级联操作是JPA提供的一种特性,允许开发者指定当一个实体被持久化、更新、删除时,其关联的实体应该如何处理。这可以通过`CascadeType`枚举在`@OneToMany`注解中设置。例如,如果我们希望当用户被删除时,所有相关的...

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

    JPA提供了多种级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果设置为`CascadeType.ALL`,那么当保存一个班级实体时,它所关联的所有学生实体也会被自动保存;同样,...

    spring jpa操作数据库 级联数据 hibernate

    例如,`@OneToMany`和`@ManyToOne`用于表示一对多或多对一的关系,级联操作如`CascadeType.PERSIST`、`CascadeType.MERGE`等可以确保当一个实体被保存或更新时,与其关联的实体也会相应更新。这在处理关联数据时非常...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    `CascadeType.ALL`意味着对父实体进行的操作(如保存、更新、删除)会级联到所有子实体。`CascadeType.MERGE`则表示仅在合并父实体时更新子实体。开发者需要根据业务需求来选择合适的级联类型,以避免不必要的数据...

    jpa--9.单向多对一

    - 如果希望在删除或更新Employee时,也影响到关联的Department,可以使用`@ManyToOne(cascade = CascadeType.ALL)`,指定级联操作类型。 6. **性能优化**: - 在处理大量数据时,考虑使用`@BatchSize`注解优化...

    实体Bean之间的级联关系

    实体Bean之间的级联关系是Java持久化框架如Hibernate或JPA中的一个重要概念,它涉及到对象关系映射(ORM)中的数据操作同步性。在数据库中,实体Bean通常代表表中的行,而实体间的级联关系则反映了表之间的关联。...

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

    3. ** Cascade操作**:`@ManyToMany`支持级联操作,如`CascadeType.PERSIST`、`CascadeType.MERGE`等,这使得在保存或更新主侧实体时,关联的次侧实体也会相应处理。 4. **Fetch策略**:默认情况下,JPA使用懒加载...

    hibernate常见异常针对于jpa

    - `CascadeType.MERGE`: 当父实体被更新时,所有关联的子实体也将被合并更新。 - `CascadeType.REMOVE`: 当父实体被删除时,所有关联的子实体也将被删除。 - `CascadeType.REFRESH`: 当父实体被刷新时,所有关联...

    传智播客JPA学习笔记.pdf

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

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

    JPA的`CascadeType`可以设置为不同的值,比如`PERSIST`, `MERGE`, `REMOVE`等,以控制关联实体的生命周期。例如,如果希望当删除学生时,自动删除所有关联的课程,可以在`@ManyToMany`上添加`cascade = CascadeType....

    hibernate课件

    常见的级联类型有:`CascadeType.ALL`、`CascadeType.PERSIST`、`CascadeType.MERGE`等。 6. **HQL与Criteria查询** HQL是Hibernate特有的面向对象的查询语言,类似于SQL,但更接近Java语法。Criteria查询则是通过...

    hibernate-jpa学习

    这些关联可以通过注解来定义,并且可以配置级联操作(如CascadeType.ALL),以简化数据操作。 查询方面,除了JPQL,Hibernate还提供了 Criteria 查询,这是一种更加面向对象的查询方式,允许使用API构建查询条件,...

    JPA笔记

    3. **级联操作(Cascading)**: 可以设置`CascadeType`来决定当父实体操作时,是否同步操作关联的子实体。 4. **查询语言(JPQL)**: 类似于SQL,但面向对象,可以编写更复杂的查询语句。 5. **实体图形(Graph)*...

    jpa_learn_01.zip

    2. **级联操作(Cascading)**:通过`@CascadeType`,可以设置一个操作(如删除)是否影响关联的实体。 3. **事务管理**:JPA支持声明式事务管理,通过`@Transactional`注解在方法级别定义事务边界。 4. **实体...

    SpringData+jpa一对一与一对多

    cascade 属性用于配置级联操作,包括 ALL、PERSIST、MERGE、REMOVE 和 REFRESH 等取值。根据需求选择合适的级联操作。 在 School 和 Address 中,我们可以使用 @OneToOne(cascade = CascadeType.ALL) 来维护一对一...

    Hibernate 注解映射

    * cascade 属性:指定级联操作的行为,可以选择 CascadeType.PERSIST、MERGE、REMOVE、REFRESH 和 ALL。 * 在双向关联中,需要通过调用双方的 set 方法来建立关系。 Hibernate 注解映射提供了一种简单、灵活的方式...

    app-jpa-relationships

    `@CascadeType`定义了不同的级联策略,如PERSIST、MERGE、REMOVE等。 2. 懒加载(Lazy Loading) 默认情况下,JPA会进行EAGER加载,即加载父实体时会一同加载所有子实体。但这样可能导致性能问题。为优化,我们...

    ejb开发使用手册,非常适合初学者

    例如,`@OneToOne`可以表示一对一的关系,并且可以设置`cascade`属性来控制级联操作,如`CascadeType.ALL`表示所有操作都会级联到关联的实体。 `persistence.xml`是EJB持久层配置文件,它定义了数据源、实体类、...

Global site tag (gtag.js) - Google Analytics