示例:国家、省份、城市的三级连动。
一、数据库要求:
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文件,具体如下:
扫描二维码关注公众号,回复:
4188512 查看本文章
<?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();
}
}