一、hibernate-extensions和Middlegen-Hibernate-r5都是hibernate工具,可以独立完成从表创建hbm.xml文件及POJO
二、通过对象持久化数据时的步骤:
1、Configuration config = new Configuration().configure();
2、SessionFactory sessionFactory = config.buildSessionFactory();
3、Session session = sessionFactory.openSession();
之后便可以使用session提供的save,get,delete,find等方法完成持久层操作了。
三、连接池可以看作一个程序,在hibernate的配置文件中配置好,并将连接池需要的jar包放到classpath路径中
,那么在使用hibernate的时候就由此连接池来管理数据库的连接,在程序中就不用做建立连接和释放连接的
操作了,由连接池来管理。
常用的连接池1、默认连接池,有缺点,建议不用
2、c3po连接池
3、dbcp连接池
4、proxool连接池,后三种根据习惯任选其一。
5、JNDI连接池,数据源已经由应用服务配置好(如Web服务器),Hibernate需要做的只是通过JNDI名查找到此数据源。应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。只要配置一个Hibernate文件,如:
hibernate.connection.datasource=java:/comp/env/jdbc/schoolproject //JNDI名
hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_loopup_class =
org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect=org.hibernate.dialect.MySQLDialect
四、orm:hibernate映射是以应用设计的POJO为依据的,通常一个POJO对应一个Hbm.xml文件
一个类中包含了另一个类(业务设计需要),则出现数据关联的情况,便于从一个类导航到另一个类。
最后决定hbm.xml文件的书写方式的是域模型和关系模型的设计(二者都起作用)
类与类之间的关系包括:关联、聚集、继承,如果对象包含的不是类的集合,而是值的集合,那么就是值集合
map,list,set
五、hibernate默认情况下,session在执行查询、commit、flush方法时清理缓存。session.flush()显示清理缓存用于一下情况:
1、session.save()方法引起数据库触发器动作
2、在程序中混用hibernate API和JDBC API时
3、JDBC驱动不健壮,导致hibernate自动清理缓存模式无法正常运行时
六、实体对象的状态(针对以个特定的session来说)
1、持久化状态:save()或者load()、find()、get()的实体对象
2、临时状态:通过new创建的对象,数据库中没有记录对应
3、游离状态:通过session的方法操作过,但是已经不在session的缓存里的实体对象
注:持久化对象属性的改变会对应到数据库记录的改变,hibernate缓存和数据库记录维持同步
七、hibernate的检索策略
1、类级别检索策略:<class>标签中lazy属性设置,默认为false,即采用立即检索,此属性之对load()方法起作用,对get()和find()方法不起作用
2、关联级别检索策略:<set>标签中lazy属性的设置,默认为false,此属性最好设置为延迟检索,即lazy设置为true
3、关联级别批量检索策略:<set>标签中batch-size属性的设置,如果此属性设置为3,lazy=true时那么在第一次访问关联对象时,类级别查询出的N个对象中,其中3个完成关联检索,lazy=false,那么立即完成其中3个的关联检索。
4、<set>元素的lazy为false时,outer-join设置为true,则采用立即左外连接检索策略,lazy为true时,outer-join不用设置,没有意义,因为左外一次全部查询出来级联的对象,而延迟检索当时不用检索关联的对象
八、hibernate的检索方式
1、HQL方式:Query query = session.createQuery("from Customer as c where c.name=:customerName");
query.setString("customerName","zhangsan");
List result = query.list();
2、SQL方式:Query query = session.createSQLQuery("select * from CUSTOMER where NAME like:custemerName")
query.setString("customerName","zhangsan");
List result = query.list();
注:HQL查询语句的关键字不区分大小写!
九、连接查询:
1、迫切内,迫切左外,是hibernate才有的,针对检索策略,如果使用迫切连接,则忽略hibernate映射文件的配置,立即检索。如果不是迫切连接,则使用hibernate配置文件的检索策略。
2、内连接,只包含符合条件的结果,左外连接除了符合条件的还包含左边表的其他记录,右外连接除了符合条件的还包含右边表的其他记录。