hibernate使用配置文件创建联合主键往MySQL数据库插入数据
2014-09-27 22:20
543 查看
惯例:先介绍编程环境:Myeclipse10.+JDK1.6+MySQL5.0+JUnit4.7
建表:
使用枚举类型来定义教师职称Title:
这里解释一下为什么要实现序列化接口Serializable:因为经常将对象序列化到硬盘上或者远程传输给其他机器,序列化是为了保存对象中的状态(State),为了以后用到此时状态的对象,可以通过从文件中获得,从网络中获得以及远程方法调用(RMI)把保存的对象的状态(State)读取出来,重新在堆中创建出原始的对象。
具体对于Serializable的理解,请移步:我对Java Serializable(序列化)的理解和总结
至于为什么要重写equals方法,其实很简单:它是为了保证数据库中的数据与内存中的数据同步,而他们都是以主键来区分的,所以这里需要重写一下equals方法。
最后解释一下为啥要重写hashCode方法:如果把数据库的对象存到哈希表里了,如果要在哈希表里找到这个对象,首先比较的就是哈希码,而最先比较的就是主键,所以要计算主键的哈希码,然后找到哈希码相同的链表,然后遍历该链表,再比较这条链表上的对象和这个对象是否equals,所以需要重写hashCode方法。
定义一个Teacher类:
映射文件:
最后写个JUnit Test Case:
最后亮成果嘚瑟一下:
欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;
建表:
使用枚举类型来定义教师职称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),共同交流编程经验,扫描下方二维码即可;
相关文章推荐
- Hibernate动态建表,通过hbm.xml配置文件创建数据表,进行数据库操作, 动态模型
- Hibernate学习之 -- 使用Middlegen-Hibernate-r5创建oracle10g的table的hibernate映射文件,Hibernate学习笔记三 ---持久化类和关系数据
- Android笔记--解决使用php文件插入数据到mysql数据库的表中中文变问号的问题
- 使用hibernate自动在MYSQL中创建表,极其简单,改下配置文件。
- Hibernate动态建表,通过hbm.xml配置文件创建数据表,进行数据库操作, 动态模型
- 使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据
- 使用hibernate连接mysql数据库正向工程hibernate.cfg.xml文件和xxx.hbm.xml配置文件
- 使用Python创建MySQL数据库实现字段动态添加以及动态的插入数据
- 使用hibernate往mysql数据库插入数据中文乱码问题
- 使用Hibernate配置联合主键的两种方式
- hibernate之利用配置文件和annotation往数据库里插入数据
- 使用hibernate连接mysql数据库正向工程hibernate.cfg.xml文件和xxx.hbm.xml配置文件
- 使用Properties文件配置实例的创建
- java中利用spring动态的创建hibernate的配置文件
- 使用hibernate与mysql时数据不能插入的原因及解决办法
- 使用Spring 来配置 hibernate 映射文件的 两种方法
- Excel数据使用jdbc直接插入Mysql数据库
- eclipse3.2下解决数据插入mysql数据库时乱码无法插入问题(Hibernate)
- Hibernate 联合主键的配置方法实例
- 两个结构完全相同的表a和b,主键为index,使用SQL语句,把a表中存在但在b表中不存在的数据插入的b表中