🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 画图 我们根据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)