您的位置:首页 > 数据库 > MySQL

hibernate使用配置文件创建联合主键往MySQL数据库插入数据

2014-09-27 22:20 543 查看
惯例:先介绍编程环境: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>


最后写个JUnit Test Case:

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),共同交流编程经验,扫描下方二维码即可;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐