初学Hibernate(1)
Hibernate的作用:
ORP: Object—Relation Mapping 对象关系映射,将对象与数据库映射起来实现持久化。
使用:
1.需要先写hibernate.cfg.xml
<!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="show_sql">true</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/center</property><property name="connection.username">root</property><property name="connection.password">1111111</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="current_session_context_class">Thread</property><property name="format_sql">true</property><mapping resource="myhibernate/domain/User.hbm.xml"/></session-factory></hibernate-configuration>
2.然后再写映射文件,映射文件要写在对应的实体类的包里面,User.hbm.xml
<?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> <class name="myhibernate.domain.User" table="user" catalog="center"><id name="id" type="java.lang.Integer" column="id"><generator type="java.lang.String" column="name"/><property name="score" type="java.lang.Integer" column="score"/></class></hibernate-mapping>
3然后就可以进行操作
Configuration config = new Configuration();config.configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession()/getCurrentSession();Transaction tx = session.beginTransaction();User u = new User();u.setName(“xx”);u.setScore(100);session.save(u);tx.commit();if(session.isOpen()){session.close();}增删改查(增加,删除,修改都需要创建事物,在执行完毕后关闭事物,查询不需要创建事物)
查询:先创建session对象,查询时不需要开启事物Transaction,然后根据id进行查询
查询完毕后要关闭session
User u = (User)session.get(User.class,1);//或者用这种方法查询,延迟加载,提高性能//User u = (User)session.load(User.class,1);增加:Transaction tx = session.beginTransaction();User u = new User();u.setName(“xx”);u.setScore(100);session.save(u);tx.commit();if(session.isOpen()){session.close();}修改:修改时只需要先查出对象,然后给对象赋新值,然后提交事务就能够修改了对象。
Transaction tx = session.beginTransaction();//加载实体对象User user = (User)session.load(User.class, 3);//修改实体对象,修改后当提交事务时会自动修改user.setName("王五");user.setScore(40);tx.commit();删除:删除有2中方式,可以先查出这个对象然后调用session.delete(user)删除这个对象,也可以创建一个对象然后给它的id赋值,然后调用session.delete(user)系统会根据id来删除对应数据,其中后者是只能用在实体的删除,即只能删除自己这一条记录时,如果级联删除时,是不能用的:删除dept,同时删除对应的emp,就不能用这个了,只能用第一种删除
Hibernate中 Session的 get和load方法的区别:
1、当数据库不存在对应ID数据时,调用load()方法将会抛出ObjectNotFoundException异常,get()方法将返回null。
2、load方法可返回实体的代理类实例,而get方法直接返回实体类(此处有异议)。
3、load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取
4、当对象.hbm.xml配置文件<class>元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作。当对象.hbm.xml配置文件<class>元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。
5、总之对于get和load的根本区别,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就跑出异常,而对于get方法 hibernate一定要获取到真实的数据,否则返回null