需求:一个用户有N个网店,一个网店有只有一个营业执照,用户不存在时他所管理的网店也不复存在
实现:
User实体类
package com.entity;
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.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="T_USER")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="user_name", nullable=false)
private String name;
/**
* 意思是这个外键所指向的是Shop实体类,在Shop类中有一个名叫user属性的和本实体对应
* cascade=CascadeType.ALL是指所有持久化操作(比如说删除)都关联到关联实体
*/
@OneToMany(targetEntity=Shop.class, mappedBy="user",cascade=CascadeType.ALL)
private Set<Shop> shops = new HashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Shop> getShops() {
return shops;
}
public void setShops(Set<Shop> shops) {
this.shops = shops;
}
}
Shop实体类
package com.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="T_Shop")
public class Shop {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="shop_id")
private Integer id;
@Column(name="shop_name", nullable=false)
private String name;
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
private User user;
@OneToOne(targetEntity=License.class, mappedBy="shop",cascade=CascadeType.ALL)
private License license;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
License许可证实体类
package com.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="T_Lic")
public class License {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="lic_name")
private String name;
@OneToOne(targetEntity=Shop.class)
@JoinColumn(name="shop_id", referencedColumnName="shop_id", unique=true)
private Shop shop;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Shop getShop() {
return shop;
}
public void setShop(Shop shop) {
this.shop = shop;
}
}
测试类方法
/**
* 创建用户的同时创建店铺
*/
@Test
public void create() {
SessionFactory factory = HibTool.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
User user = new User();
user.setName("王小明");
session.save(user);
Shop shop = new Shop();
shop.setName("王小明的店铺");
shop.setUser(user);
session.persist(shop);
session.getTransaction().commit();
factory.close();
}
/**
* 为用户创建店铺
*/
@Test
public void add() {
SessionFactory factory = HibTool.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
//获取需要创建的用户
User user = (User) session.get(User.class, 1);
Shop shop = new Shop();
shop.setName("王小明的第二家店铺");
shop.setUser(user);
session.save(shop);
session.getTransaction().commit();
factory.close();
}
/**
* 为店铺加许可
*/
@Test
public void addLic() {
SessionFactory factory = HibTool.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
Shop shop = (Shop) session.get(Shop.class, 1);
License license = new License();
license.setName(shop.getName() + "的许可");
license.setShop(shop);
session.save(license);
session.getTransaction().commit();
factory.close();
}
/**
* 删除用户,与之对应的shop还有对应的License一并删除
*/
@Test
public void delete() {
SessionFactory factory = HibTool.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
User user = (User) session.get(User.class, 1);
session.delete(user);
session.getTransaction().commit();
factory.close();
}
构建出了的表结构