# 画图
我们根据ER图,加入SET/GET方法,并实现IdEntity接口后。得到一个如下的实体类图:
![https://box.kancloud.cn/41a1b532ced14defa5f2caa853e86ab0_668x822.png](https://box.kancloud.cn/41a1b532ced14defa5f2caa853e86ab0_668x822.png)
根据上图,我们使用Astah中的代码自动生成工具,自动生成如下代码:
当然了,如果我们没有Astah工具,根据上面的类图,也能非常轻松的得到以下代码。
```
package com.mengyunzhi.javaee.entity;
import java.io.Serializable;
public class Klass implements IdEntity {
/**
* 班级
*
*/
private static final long serialVersionUID = 1L;
private Long klassId;
private String name;
private Long teacherId;
@Override
public void setId(Serializable id) {
}
@Override
public Serializable getId() {
return null;
}
public Long getKlassId() {
return null;
}
public void setKlassId(Long id) {
}
public String getName() {
return null;
}
public void setName(String name) {
}
public Long getTeacherId() {
return 0;
}
public void setTeacherId(Long teacherId) {
}
@Override
public String toString() {
return null;
}
public Klass() {
}
public Klass(String name, long teacherId) {
}
}
```
得到代码后,我们结合eclipse的自动查错功能,对代码进行补充。
我们也可以在类图中,去除get/set方法。
![https://box.kancloud.cn/a2450f0eb72be8264971b09f85e00888_540x552.png](https://box.kancloud.cn/a2450f0eb72be8264971b09f85e00888_540x552.png)
然后将得到以下代码:
```
package com.mengyunzhi.javaee.entity;
import java.io.Serializable;
public class Klass implements IdEntity {
private static final long serialVersionUID = 1L;
private Long klassId;
private String name;
private Long teacherId;
@Override
public String toString() {
return null;
}
public Klass() {
}
public Klass(String name, long teacherId) {
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#getId()
*/
public Serializable getId() {
return null;
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#setId(java.io.Serializable)
*/
public void setId(Serializable id) {
}
}
```
然后再利用eclipse中的代码自动生成功能,生成get/set方法:
```
package com.mengyunzhi.javaee.entity;
import java.io.Serializable;
public class Klass implements IdEntity {
private static final long serialVersionUID = 1L;
private Long klassId;
private String name;
private Long teacherId;
public Long getKlassId() {
return klassId;
}
public void setKlassId(Long klassId) {
this.klassId = klassId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getTeacherId() {
return teacherId;
}
public void setTeacherId(Long teacherId) {
this.teacherId = teacherId;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return null;
}
public Klass() {
}
public Klass(String name, long teacherId) {
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#getId()
*/
public Serializable getId() {
return null;
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#setId(java.io.Serializable)
*/
public void setId(Serializable id) {
}
}
```
最后,我们再结合使用eclipse进行代码补充。
无论是哪种方法,最终,我们需要补充部分代码,加入部分引入的类,并使用注解方式来加入注解。最终期待的代码如下:
```
package com.mengyunzhi.javaee.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="Klass")
public class Klass implements IdEntity {
/**
* 班级
*
*/
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(name="idGenerator",strategy="native")
@GeneratedValue(generator="idGenerator")
private Long klassId;
private String name;
private Long teacherId;
public Long getKlassId() {
return klassId;
}
public void setKlassId(Long klassId) {
this.klassId = klassId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getTeacherId() {
return teacherId;
}
public void setTeacherId(Long teacherId) {
this.teacherId = teacherId;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public Klass() {
}
@Override
public String toString() {
return "Klass [klassId=" + klassId + ", name=" + name + ", teacherId="
+ teacherId + "]";
}
public Klass(String name, long teacherId) {
this.name = name;
this.teacherId = teacherId;
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#getId()
*/
public Serializable getId() {
return this.getKlassId();
}
/**
* @see com.mengyunzhi.javaee.entity.IdEntity#setId(java.io.Serializable)
*/
public void setId(Serializable id) {
this.setKlassId((Long) id);
}
}
```
# 测试
在进行实体测试前,我们需要修改hibernate的配置文件,将此实体添加至其maping中,来告诉hibernate,该类是个实体类,与数据表是一一对应的关系。
hibernate.cfg.xml
```
...
<!-- 是否在控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- 加载entity.Teacher实体类映射文件 -->
<mapping class="com.mengyunzhi.javaee.entity.Teacher" />
<mapping class="com.mengyunzhi.javaee.entity.Klass" />
</session-factory>
...
```
> 保存文件后,系统将自动重新加载该配置文件以使其生效。如果你保存该文件后,发现控制台没有任何的变化。那么你需要手动的重新启动tomcat服务。
单元测试:
我们可以像5.2.2小节一样,新建factory,然后获取session。在这,由于我们在AbstractDao中已经统一处理过session了。所以,我们直接将AbstractDao中的getCurrentSession属性改为public后,调用测试.
```
package com.mengyunzhi.javaee.dao;
public abstract class AbstractDao implements Serializable, Dao {
- protected static Session getCurrentSession() {
+ public static Session getCurrentSession() {
// 每个数据库只需要一个sessionFactory,在这里进行单一实例处理。
```
然后,我们在测试文件中对其进行调用,并尝试完成数据添加操作.
```
package com.mengyunzhi.javaee.entityTest;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.mengyunzhi.javaee.dao.AbstractDao;
import com.mengyunzhi.javaee.entity.Klass;
public class KlassTest {
@Test
public void create() {
// 获取Session
Session session = AbstractDao.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
try {
// 实例化实体
Klass klass = new Klass("一一班", 1);
session.save(klass);
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
}
}
```
测试:
```
Hibernate: insert into Klass (name, teacherId) values (?, ?)
```
我们再多执行几次,发现每执行一次,数据表中,就会多出一条记录。
![https://box.kancloud.cn/75496cf6ae73ce4b90990cdb9557a72d_674x318.png](https://box.kancloud.cn/75496cf6ae73ce4b90990cdb9557a72d_674x318.png)
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层