Hibernate基于持久层框架的DAO模式应用

来源:互联网 发布:通化县教育局网络办公 编辑:程序博客网 时间:2024/05/11 09:14
           实验七 基于持久层框架的DAO模式应用

实验目的:1.掌握Hibernate运行环境的配置
2.掌握持久类的创建及其映射文件的配置
3.掌握基于Hibernate的DAO模式的运用
实验步骤:
①建立数据库



②新建Java项目



③将以下JAR文件及数据库驱动类库添加到构建路径



④编写Hibernate配置文hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">157582</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/sise/hibernate/lesson1/domain/Person.hbml.xml"/>
</session-factory>

</hibernate-configuration>



⑤编写持久化类
package com.sise.hibernate.lesson1.domain;


import javax.persistence.Entity;
public class Person{
private Integer id;
private String name;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
private int age;
private String sno;
private char sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}




⑥编写映射文件Person.hbm.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">

<hibernate-mapping package="com.sise.hibernate.lesson1.domain">
<class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="sno" type="java.lang.String" length="12" not-null="true" column="sno"/>
<property name="name" type="java.lang.String" length="12" not-null="true" column="name"/>
<property name="sex" type="character" length="2"/>
<property name="age" type="integer" />
</class>
</hibernate-mapping>





⑧编写DAO接口
package com.sise.hibernate.lesson1.dao;


import com.sise.hibernate.lesson1.domain.Person;


public interface HibernateDao {
public void addPerson(Person person);
public void deletePerson(Person person);
public void updatePerson(Person person);
public Person getPersonById(int id);

}




⑨使用Hibernate API实现DAO接口
package com.sise.hibernate.lesson1.dao.impl;


import org.hibernate.Session;
import org.hibernate.Transaction;
import org.omg.CORBA.TCKind;


import com.sise.hibernate.lesson1.dao.HibernateDao;
import com.sise.hibernate.lesson1.domain.Person;
import com.sise.hibernate.lesson1.util.HibernateUtil;


public class HibernateDaoImpl implements HibernateDao {


@Override
public void addPerson(Person person) {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try {
session.persist(person);
tx.commit();
} catch (Exception e) {
if(null!=tx) tx.rollback();
e.printStackTrace();
}
}


@Override
public void deletePerson(Person person) {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try {
session.delete(person);
tx.commit();
} catch (Exception e) {
if(null!=tx) tx.rollback();
e.printStackTrace();
}
}


@Override
public void updatePerson(Person person) {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try {
session.update(person);
tx.commit();
} catch (Exception e) {
if(null!=tx) tx.rollback();
e.printStackTrace();
}
}


@Override
public Person getPersonById(int id) {
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Person person=session.get(Person.class,id);
tx.commit();
return person;
}


}




⑩编写测试类,查看结果。
package com.sise.hibernate.lesson1.test;


import com.sise.hibernate.lesson1.dao.HibernateDao;
import com.sise.hibernate.lesson1.dao.impl.HibernateDaoImpl;
import com.sise.hibernate.lesson1.domain.Person;


public class HibernateDaoTest {
public static void  main(String[] args) {
HibernateDao hibernateDao=new HibernateDaoImpl();
Person person1=new Person();
person1.setSno("14401122");
person1.setName("Jack");
person1.setSex('男');
person1.setAge(22);
Person person2=new Person();
person2.setSno("14401123");
person2.setName("John");
person2.setSex('女');
person2.setAge(21);
hibernateDao.addPerson(person1);
hibernateDao.addPerson(person2);
Person p1=hibernateDao.getPersonById(1);
System.out.println("ID:"+p1.getId()+"\n"+"学号:"+p1.getSno()+"\n"+"姓名:"
+p1.getName()+"\n"+"性别:"+p1.getSex()+"\n"+"年龄:"+p1.getAge());
Person p2=hibernateDao.getPersonById(2);
System.out.println("ID:"+p2.getId()+"\n"+"学号:"+p2.getSno()+"\n"+"姓名:"
+p2.getName()+"\n"+"性别:"+p2.getSex()+"\n"+"年龄:"+p2.getAge());
p1.setAge(39);
hibernateDao.updatePerson(p1);
Person p3=hibernateDao.getPersonById(3);
if (null==p3) {
System.out.println("Sorry,John已经被删除");
}
}
}


实验结果截图:




实验总结:实验成功。实验一开始遇到如下问题:


INFO: HHH000228: Running hbm2ddl schema update
org.hibernate.MappingException: 
Unknown entity:com.sise.hibernate.lesson1.domain.Person
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1460)
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:225)


原因是:
不同版本的获取SessionFactory的方法不一样。 例如Hibernate 4.3  其中的一种 获取SessionFactory的方法
 
ServiceRegistry service=new StandardServiceRegistryBuilder().applySettings(con.getProperties()).build();

而Hibernate 5.1 的获取SessionFactory的方法
StandardServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().configure().build(); 

 而我在Hibernate5.0.2的版本下用了Hibernate4.3的获取SessionFactory的方法

所以会出现上面所示的错误。



分享经验,一起努力。

1 0
原创粉丝点击