在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语句是一样的