Hibernate详细教程
2021-07-02 09:04
标签:ips except 就会 arc service update 集合属性 tran person
一、搭建Hibernate环境
1.在src目录下创建hibernate.cfg.xml配置文件
PS:文件的名字不能改!
root 1234 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test org.hibernate.dialect.MySQL5InnoDBDialect true
update none
2. 编写实体类,以Person类为例
package test.Hibernate.model; import java.util.HashSet; import java.util.Set; public class Person { @Override public String toString() { return "Person [id=" + id + ", 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 SetgetAddress() { return address; } public void setAddress(Set address) { this.address = address; } private int id; private String name; private Set address = new HashSet (); }
3.编写Person.hbm.xml实体类配置文件
4.在hibernate.cfg.xml中加入映射信息
5.使用MyEclipse生成SessionFactory
package test.Hibernate.SessionFactory; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */ public class SessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static final ThreadLocalthreadLocal = new ThreadLocal (); private static org.hibernate.SessionFactory sessionFactory; private static Configuration configuration = new Configuration(); private static ServiceRegistry serviceRegistry; static { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private SessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the SessionFactory
if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory * */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } /** * return hibernate configuration * */ public static Configuration getConfiguration() { return configuration; } }
6.编写测试类
package test.Hibernate.dao; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import test.Hibernate.SessionFactory.SessionFactory; import test.Hibernate.model.Person; public class PersonDao { @Test public void add(){ Session session = SessionFactory.getSession(); Transaction tr = session.beginTransaction(); //---------------------------------------------- Person p = new Person(); p.setName("test"); p.getAddress().add("firstAddr"); p.getAddress().add("secondAddr"); p.getAddress().add("thirdAddr"); p.getAddress().add("fourthAddr"); session.save(p); //---------------------------------------------- tr.commit(); SessionFactory.closeSession(); } @Test public void get(){ Session session = SessionFactory.getSession(); Transaction tr = session.beginTransaction(); //---------------------------------------------- Person p = (Person)session.get(Person.class, 2); System.out.println(p); //---------------------------------------------- tr.commit(); SessionFactory.closeSession(); } }
二、主键生成策略
identity:使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持。
sequence:在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence)在使用Oracle数据库时可以使用这一个。
hilo:使用高低位算法生成主键值。只需要一张额外表,所有的数据都支持。
native:根据底层数据库的能力选择 identity、sequence 或者 hilo中的一个。
assigned:手工指定主键值。
uuid:由Hibernate自动生成UUID并指定为主键值。
三、Hibernate映射关系配置
1.一对一映射(以主键关联作为示例)User与IdCard(有外键方)的XML配置:
user
2.一对多,多对一(以Father和Children为例)
3.多对多(以Student和Teacher为例)
PS:有一方的set集合要标明inverse=true(后面会讲)
四、inverse和cascade的区别(个人总结,有不对还望指正)
1.inverse=false在一对多删除时是把孩子的外键设置为null,然后删除父亲,孩子不删除,而casecade=all在一对多删除时是把孩子的外键设置为null,然后删除父亲,然后再删除孩子
2.many to many的时候由一方维护,所以一方要设置inverse=false,但是inverse=true的另一方直接删除会出错,这个时候可以用casecade完成级联删除
3.inverse=false只用于set等集合属性,在one to one关系中可以用casecade完成级联删除
五、使用C3P0连接池
1.需要额外导入3个jar包
2.在hibernate.cfg.xml中加入C3P0配置信息
org.hibernate.connection.C3P0ConnectionProvider 5 20 120 3000
六、HQL语句
@Test public void HQLSearch(){ Session session = SessionFactory.getSession(); Transaction tr = session.beginTransaction(); //----------------------------------------- //common search with where // String hql= "select e.id,e.name from User e where e.id>=5 and e.id=? and id
七、DML语句
@Test public void DML(){ Session session = SessionFactory.getSession(); Transaction tr = session.beginTransaction(); //----------------------------------------- User u = (User)session.get(User.class, 11); String sql = "update User set name=? where id>?"; int result = session.createQuery(sql) .setParameter(0, "updated") .setParameter(1, 10) .executeUpdate(); System.out.println("count of update:"+result); //the object‘s status in session was not updated when the object in database have been changed,so if you want //to get the updated object in session,you should use method "refresh". session.refresh(u); System.out.println(u); //----------------------------------------- tr.commit(); SessionFactory.closeSession(); }
八、开启二级缓存
1. 需要导入以下jar包
2.在hibernate.cfg.xml中加入以下配置
true org.hibernate.cache.ehcache.EhCacheRegionFactory true
九、Hibernate对象状态及转化
Hibernate详细教程
标签:ips except 就会 arc service update 集合属性 tran person
原文地址:http://www.cnblogs.com/zhujiabin/p/7128420.html