创建第一个Hibernate 小例子
1.首先下载相关jar包 Hibernate.XXX.Final.jar
2.进入jar包进入required里面都是hibernate的核心文件
3.打开myeclipse,创建一个项目文件,并导入各种jar包,加上jdbc连接jar包
4.设置项目支持hibernate,junit的框架
5.配置hibernate.cfg.cml
<?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">
<![CDATA[jdbc:mysql://localhost:3306/task?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="show_sql">true</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/imooc/entity/Student.hbm.xml" />
<mapping resource="com/imooc/entity/Grade.hbm.xml" />
</session-factory>
</hibernate-configuration>
6.创建实体类(属性必须私有化,属性的setter和getter,空构造和属性构造)
package com.imooc.entity;
public class Student {
private int id;
private String name;
private Grade grade;
public Student() {
}
public Student(String name) {
super();
this.name = name;
}
public Student(int id, String name) {
this.id = id;
this.name = 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;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
package com.imooc.entity;
import java.util.HashSet;
import java.util.Set;
public class Grade {
private int gid;
private String gname;
private Set<Student> studentList = new HashSet<Student>();
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public Set<Student> getStudentList() {
return studentList;
}
public void setStudentList(Set<Student> studentList) {
this.studentList = studentList;
}
public Grade(int gid, String gname) {
this.gid = gid;
this.gname = gname;
}
public Grade(String gname) {
super();
this.gname = gname;
}
public Grade() {
}
}
7.配置实体类的映射文件,并在hibernate.cfg.xml中插入映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.imooc.entity.Grade" table="grade" catalog="task">
<id name="gid" type="java.lang.Integer">
<column name="gid" />
<generator class="identity" />
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="50" />
</property>
<set name="studentList" table="student" inverse="true" >
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
<!-- <list name="studentList" table="Student"> -->
<!-- <index column="gid"></index> -->
<!-- <one-to-many class="com.imooc.entity.Student"/> -->
<!-- </list> -->
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.imooc.entity.Student" table="student" catalog="task">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
<many-to-one name="grade" column="gid" class="com.imooc.entity.Grade" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
8.创建一个测试类,测试代码,创建一个src的同级目录test
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.imooc.entity.Grade;
import com.imooc.entity.Student;
public class StudentTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
Configuration config = new Configuration().configure();
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties());
StandardServiceRegistry ssr = ssrb.build();
sessionFactory = config.buildSessionFactory(ssr);
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void destory(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void saveStudent(){
Student s1 = new Student("cqc");
Grade g = new Grade("13计科1");
Student s2 = new Student("megan");
s1.setGrade(g);
s2.setGrade(g);
g.getStudentList().add(s1);
g.getStudentList().add(s2);
// session.save(g);
session.save(s2);
session.save(s1);
}
}
刚开始赋值的时候手动加入了id,结果报了org.hibernate.StaleStateException: Batch update returned unexpected row coun。。。的错误,百度了一下,说是因为本地数据库id是自增的,不能手动设置id,删去手动设置的id之后,发现是可以运行了,至于为什么,还不懂。。。
对于这个例子的多对一和一对多的关系中,要设置cascade和inverse(反转控制)
inverse是让多方控制一方的属性,可以提高工作效率,由多方维护关联关系
cascade是为了在比如说save-update,在保存和更新的操作时级联操作所关联的对象