【实例】hibernate中用annotation注释声明外键

需求:一个用户有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();
	}
	

构建出了的表结构




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值