# 畫圖
我們根據ER圖,加入SET/GET方法,并實現IdEntity接口后。得到一個如下的實體類圖:

根據上圖,我們使用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方法。

然后將得到以下代碼:
```
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 (?, ?)
```
我們再多執行幾次,發現每執行一次,數據表中,就會多出一條記錄。

- 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
- 第十四章:重構服務層