惯例:先介绍编程环境:Myeclipse10.+JDK1.6+MySQL5.0+JUnit4.7
建表:
使用枚举类型来定义教师职称Title:
package com.hibernate.model;
public enum Title {
A,B,C
}
定义一个联合主键类TeacherPK:
(必须实现Serializable接口以及重写equals和hashCode方法)
package com.hibernate.model;
import java.io.Serializable;
public class TeacherPK implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o){
if(o instanceof TeacherPK) {
TeacherPK pk = (TeacherPK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())) {
return true;
}
}
return false;
}
@Override
public int hashCode(){
return this.name.hashCode();
}
}
这里解释一下为什么要实现序列化接口Serializable:因为经常将对象序列化到硬盘上或者远程传输给其他机器,序列化是为了保存对象中的状态(State),为了以后用到此时状态的对象,可以通过从文件中获得,从网络中获得以及远程方法调用(RMI)把保存的对象的状态(State)读取出来,重新在堆中创建出原始的对象。
具体对于Serializable的理解,请移步:我对Java Serializable(序列化)的理解和总结
至于为什么要重写equals方法,其实很简单:它是为了保证数据库中的数据与内存中的数据同步,而他们都是以主键来区分的,所以这里需要重写一下equals方法。
最后解释一下为啥要重写hashCode方法:如果把数据库的对象存到哈希表里了,如果要在哈希表里找到这个对象,首先比较的就是哈希码,而最先比较的就是主键,所以要计算主键的哈希码,然后找到哈希码相同的链表,然后遍历该链表,再比较这条链表上的对象和这个对象是否equals,所以需要重写hashCode方法。
定义一个Teacher类:
package com.hibernate.model;
public class Teacher {
private TeacherPK pk = null;
private Title title = null;
private int age;
public TeacherPK getPk() {
return pk;
}
public void setPk(TeacherPK pk) {
this.pk = pk;
}
public Title getTitle() {
return title;
}
public void setTitle(Title title) {
this.title = title;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.model">
<class name="Teacher" table="_Teacher">
<composite-id name="pk" class="com.hibernate.model.TeacherPK">
<key-property name="id" column="_id"></key-property>
<key-property name="name" column="_name"></key-property>
</composite-id>
<property name="age" column="_age"></property>
<property name="title" column="_title">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">
com.hibernate.model.Title
</param>
<!--<param name="type">12</param>里面的type是类型,固定的,type的为12表示枚举类型映射到 数据库终端 类型为varchar,如果是4则映射为integer类型 (默认类型)-->
<!-- 如果使用Annotation则标注@Enumerated(EnumType.ORDINAL)或者@Enumerated(EnumType.STRING) -->
<param name="type">12</param>
</type>
</property>
</class>
</hibernate-mapping>
配置文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://192.168.199.230/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">1</property>
<!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property>-->
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<!-- <property name="current_session_context_class">thread</property>-->
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/hibernate/model/Teacher.hbm.xml"/>
</session-factory>
</hibernate-configuration>
package com.hibernate.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TeacherTest {
public static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
try{
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
catch(Exception e) {
e.printStackTrace();
}
finally{
}
}
@Test
public void test() {
Teacher t = new Teacher();
TeacherPK pk = new TeacherPK();
pk.setId(1120010109);
pk.setName("huanglei");
t.setAge(23);
t.setPk(pk);
Title title = Title.B;
t.setTitle(title);
Session session = sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
最后亮成果嘚瑟一下:

欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;