Hibernate使用注解实现1VN的关系?

示例:国家、省份、城市的三级连动。

一、数据库要求:

1、国家表nation:nid国家编号、nname国家名称

2、省份表province:pid省份编号、pname省份名称、nid国家的编号

3、城市表city:cid城市编号、cname城市名称、pid省份编号

二、实体类:

1、国家表Nation.java的实体类:

@Entity//指定为实体类
@Table(name="nation")//对象数据库的表
public class Nation {
	@Id
	@GenericGenerator(name="myid",strategy="guid")
	@GeneratedValue(generator="myid")//指名主键
	private String nid;//国家编号

	@Column(name="nname")
	private String nname;//国家名称

        //设置与省份表的1VN关系
	@OneToMany(targetEntity=Province.class,cascade=CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="nid")
	private Set<Province> sp=new HashSet<>();//set集合用户存放N个省份对象

	public String getNid() {
		return nid;
	}
	public void setNid(String nid) {
		this.nid = nid;
	}
	public String getNname() {
		return nname;
	}
	public void setNname(String nname) {
		this.nname = nname;
	}
	public Set<Province> getSp() {
		return sp;
	}
	public void setSp(Set<Province> sp) {
		this.sp = sp;
	}
	public Nation(String nid, String nname, Set<Province> sp) {
		super();
		this.nid = nid;
		this.nname = nname;
		this.sp = sp;
	}
	public Nation() {
		super();
		// TODO Auto-generated constructor stub
	}
}

2、省份表Province.java的实体类:

@Entity//指名实体类
@Table(name="province")//对应数据库表
public class Province {
	@Id
	@GenericGenerator(name="myid",strategy="guid")
	@GeneratedValue(generator="myid")//指名主键
	private String pid;//省份编号

	@Column(name="pname")
	private String pname;//省份名称

        //设置与国家表的NV1关系
	@ManyToOne(targetEntity=Nation.class)
	@JoinColumn(name="nid",insertable = false)
	private Nation nation;//国家表的对象

        //设置与城市表的1VN关系
	@OneToMany(targetEntity=City.class,cascade=CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="pid")
	private Set<City> sc=new HashSet<>();//用于保存城市表的N个对象

	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public Nation getNation() {
		return nation;
	}
	public void setNation(Nation nation) {
		this.nation = nation;
	}
	public Set<City> getSc() {
		return sc;
	}
	public void setSc(Set<City> sc) {
		this.sc = sc;
	}
	public Province(String pid, String pname,  Nation nation, Set<City> sc) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.nation = nation;
		this.sc = sc;
	}
	public Province() {
		super();
		// TODO Auto-generated constructor stub
	}
}

3、城市表City.java的实体类:

@Entity//指名为实体类
@Table(name="city")//对应数据库的表
public class City {
	@Id
	@GenericGenerator(name="myid",strategy="guid")
	@GeneratedValue(generator="myid")//指名主键
	private String  cid;//城市编号

	@Column(name="cname")
	private String cname;//城市名称

        //设置与省份表的NV1关系
	@ManyToOne(targetEntity=Province.class)
	@JoinColumn(name="pid")
	private Province province;//省份表的对象

	public String getCid() {
		return cid;
	}
	public void setCid(String cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public Province getProvince() {
		return province;
	}
	public void setProvince(Province province) {
		this.province = province;
	}
	public City() {
		super();
		// TODO Auto-generated constructor stub
	}
	public City(String cid, String cname, Province province) {
		super();
		this.cid = cid;
		this.cname = cname;
		this.province = province;
	}
}

三、配置映射文件:

在src/main/resources路径下创建连接数据库的hibernate.cfg.xml文件,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.password">sasa</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/chencao?characterEncoding=UTF-8</property>
		<property name="hibernate.connection.username">root</property>

		<property name="show_sql">true</property>
		<property name="format_sql">true</property>

		<!-- 配置映射(与配置式的区别:class属性值为实体类的权限定名)-->
		<mapping class="com.zking.hibernate05_02.entity.Nation" />
		<mapping class="com.zking.hibernate05_02.entity.Province" />
		<mapping class="com.zking.hibernate05_02.entity.City" />
	</session-factory>
</hibernate-configuration>

注解式和配置的区别:注解式则省略实体类的映射文件。

四、测试类中实现CRUD:

public class OneToManyAction extends ActionSupport {

	/**
	 * @Fields serialVersionUID : TODO(描述这个变量表示什么)
	 */
	private static final long serialVersionUID = -1669427098473278330L;

	/**
	 * 
	 * @Title: add
	 * @Description: 新增数据的方法
	 * @return void
	 */
	@Test
	public void OneToManyActionTest() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// 定义Nation对象
		Nation nation = new Nation();
		nation.setNname("中国");

		// 定义Province对象
		Province p01 = new Province();
		p01.setPname("湖南");
		Province p02 = new Province();
		p02.setPname("湖北");

		// 定义City对象
		City c01 = new City();
		c01.setCname("长沙");

		City c02 = new City();
		c02.setCname("武汉");

		// 互设 c
		nation.getSp().add(p01);
		nation.getSp().add(p02);

		p01.setNation(nation);
		p02.setNation(nation);

		p01.getSc().add(c01);
		p02.getSc().add(c02);

		c01.setProvince(p01);
		c02.setProvince(p02);

		// 保存
		session.save(nation);

		transaction.commit();
		sessionFactory.close();
		session.close();
	}

	/**
	 * 
	 * @Title: find
	 * @Description: 查询的方法
	 * @return void
	 */
	@Test
	public void find() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// 查询国家
		// 查询可能会出现懒加载异常(Session 关闭后再查)
		Nation n = session.get(Nation.class, "befa7666-b8c2-11e8-a42a-80fa5b5015f0");

		System.out.println(n);

		transaction.commit();
		session.close();
		sessionFactory.close();

	}

	/**
	 * 
	 * @Title: edit
	 * @Description: 修改数据的方法
	 * @return void
	 */
	// @Test
	public void edit() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// 得到国家
		// Nation n1 = session.get(Nation.class,
		// "e6a74fce-b4ae-11e8-8972-80fa5b5015f0");
		// n1.setNname("Chain");

		// 得到省份
		// Province p1=session.get(Province.class,
		// "e6a74fce-b4ae-11e8-8972-80fa5b5015f0");
		// p1.setPname("Hunan");

		// 得到城市
		City c1 = session.get(City.class, "e6a77e3c-b4ae-11e8-8972-80fa5b5015f0");
		c1.setCname("Yiyang");

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

	/**
	 * 
	 * @Title: remove
	 * @Description: 删除数据的方法
	 * @return void
	 */
	// @Test
	public void remove() {
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// 查询国家
		Nation n = session.get(Nation.class, "670dc90a-b4c3-11e8-8972-80fa5b5015f0");
		session.delete(n);

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_42246139/article/details/84202570
今日推荐