package com.hanqi.test; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.hanqi.entity.User; public class Test01 { private SessionFactory sf; private Session se; private Transaction ts; //在测试用例方法被执行之前自动执行方法 //一般用来初始化公用的对象 @Before public void init() { //1获取配置文件 Configuration cfg=new Configuration().configure(); //2注册配置 ServiceRegistry sr=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); //3获取SessionFactory(相当于JDBC) sf =cfg.buildSessionFactory(sr); System.out.println(sf); //4产生session 生成会话 se=sf.openSession(); //5启动事物 ts=se.beginTransaction(); } //后知方法 @After public void detory() { //7提交事务 ts.commit(); //8释放资源 se.close(); sf.close(); } //测试Hibernate连接数据库 @Test public void test() { //6操作数据库 //(1)添加数据 //实例化的新对象,处于临时状态 User u1=new User(); u1.setBirthday(new Date()); u1.setMoney(2000); u1.setPassword("123456"); u1.setUserName("恩恩"); //(2)保存数据 //通过save方法吧对象从临时状态转成持久化状态 se.save(u1).toString(); } @Test public void test1() { //查询数据 //提供两个参数 //1需要返回哪一个持久化类的实例 //2实例的标识(数据的主键值) //通过Session的get方法获得的对象处于持久化状态 User u2=(User)se.get(User.class, 1); //修改 u2.setUserName("庚衣"); System.out.println(u2); //删除 se.delete(u2); //持久化对象进入删除状态 } @Test public void test02() { User u1 =(User)se.get(User.class, 4); //get立即加载 System.out.println("get后"); System.out.println(u1); } @Test public void test03() { User u1 =(User)se.load(User.class, 4); //load延迟加载 懒加载 System.out.println("load后"); System.out.println(u1); //当使用是再加载 } //测试游离状态 @Test public void Test04() { //得到持久化状态 User u1 =(User)se.load(User.class, 7); System.out.println(u1); //关闭Session se.close(); //使u1进入游离状态 u1.setUserName("李白"); //把OID换成null u1.setUserID(null); System.out.println("重新设置Session事物"); //从新创建session se=sf.openSession(); //重新开启事物 ts=se.beginTransaction(); // se.saveOrUpdate(u1); //使用save //se.update(u1); System.out.println(u1); } }
package com.hanqi.entity; //持久化类 import java.util.Date; public class User { private Integer userID; private String userName; private Date birthday; private double money; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getUserID() { return userID; } public void setUserID(Integer userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } public User() { super(); } public User(Integer userID, String userName, Date birthday, double money) { super(); this.userID = userID; this.userName = userName; this.birthday = birthday; this.money = money; } @Override public String toString() { return "User [userID=" + userID + ", userName=" + userName + ", birthday=" + birthday + ", money=" + money + ", password=" + password + "]"; } }
<?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 > <!-- 数据库连接 --> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.password">123</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="hibernate.connection.username">test0816</property> <!-- 数据库方案 --> <property name="hibernate.default_schema">TEST0816</property> <!-- 数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 调试 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 自动见表方法 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 映射文件--> <mapping resource="com/hanqi/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-11-7 14:41:21 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.hanqi.entity.User" table="T_USER"> <id name="userID" type="java.lang.Integer"> <column name="USERID" /> <generator class="native" /> </id> <property name="userName" type="java.lang.String"> <column name="USERNAME" length="20" not-null="true" unique="true"/> </property> <property name="birthday" type="java.util.Date"> <column name="BIRTHDAY" /> </property> <property name="money" type="double"> <column name="MONEY" length="8" scale="2" sql-type="NUMBER" default="0"/> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="10"/> </property> </class> </hibernate-mapping>
当在测试test04时出现错误了!!!!!!!!!!!!!!!!!1
十一月 08, 2016 4:28:58 下午 org.hibernate.AssertionFailure <init>
ERROR: HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null identifier
十一月 08, 2016 4:28:58 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:oracle:thin:@localhost:1521:orcl]