0
点赞
收藏
分享

微信扫一扫

Hibernate调用详解

深夜瞎琢磨 2021-09-21 阅读 52

创建持久化的Java类

1.必须创建一个无参的构造器。可以使用Constructor.newInstance()来持久化类。

  1. 提供一个标识属性(identifier property)通常映射为数据库表的主键字段。如果没有这个属性,一些功能将不起作用。如Session.saveOrUpdate()。
  2. 为类的持久化字段提供访问方法(get/set),Hibernate对Java bean风格的属性实行持久化。
  3. 使用非final类。在运行时生成代理是Hibernate的一个重要的功能,如果持久化类没有实现任何借口,Hibernate使用CGLIB生成代理。如果使用final,将无法生成CGLIB代理。
  4. 重写equals和hashCode方法。如果要把持久化的类放到Set中(当需要进行关联映射时),则应该重写这两个方法。

Hibernate不要求持久化类继承任何父类或者实现接口,这样可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因。

详解对象关系映射文件

Hibernate采用XML文件来指定对象和数据库之间关系的映射。在运行时Hibernate将根据这个映射文件生成各种SQL语句。Hibernate映射文件指定一些基本的配置信息。Hibernate将根据方言生成一些数据库特定的SQL语句。

映射的扩展名为.hbm.xml。

<hibernate-mapping>
<class name="com.hibernate.helloworld.HelloWorld" table="helloworld" schema="public" catalog="hibernate">
    <id name="id">
        <column name="id" sql-type="integer"/>
        <generator class="native"/>
    </id>
    <property name="title">
        <column name="title" sql-type="text" not-null="true"/>
    </property>
    <property name="author">
        <column name="author" sql-type="text" not-null="true"/>
    </property>
    <property name="date">
        <column name="date" sql-type="date" not-null="true"/>
    </property>
</class>
</hibernate-mapping>

重要参数解释:

<generator class="native"/>

指定主键的生成方式。native使用数据库底层的生成方式。

<column name=""/>

对应数据库中的列名。

<property name="hibernate.hbm2ddl.auto">update</property>

指定运行时生成数据表的策略。

<mapping resource="com/hibernate/helloworld/HelloworldEntity.hbm.xml"/>

指定程序需要关联的映射文件。

通过Hibernate API访问数据库

Configuration类负责关联Hibernate配置信息。包括如下内容:
Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、Dialect、数据库连接池等。对应hibernate.cfg.xml。
持久化类与数据库表的映射关系(*.hbm.xml文件)

创建Configuration的两种方式

  • 属性文件(hibernate.properties)
Configuration cfg = new Configuration();
  • Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();

Configuration的configure方法还支持带参数的访问

File file = new File("simple.xml");
Configuration cfg = new Configuration().configure(file );

SessionFactory接口

针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
SessionFactory对象一旦创建完毕,即被赋予特定的配置信息。SessionFactory是生成Session的工厂。

构造SessionFactory很消耗资源。一般情况下一个应用只创建一个SessionFactory对象。

Hibernate4新增了一个ServiceRegistry接口,所以基于Hibernate的配置或者服务必须统一向这个ServiceRegistry注册后才能生效。

SessionFactory sessionFactory = null;
ServiceRegistry serviceRegistry = 
    new ServiceRegistryBuilder().applySettings(Configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry );

Session接口

Session是应用程序与数据库之间交互操作的一个单线程对象。是Hibernate运作的中心。所有的持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存。显式执行flush之前,所有持久层操作的数据都缓存在session对象处。相当于JDBC的Connection。


持久化的类与Session关联起来后就具有了持久化的功能。

Session类的方法

Transaction事务

代表一次原子操作。所有持久化层必须在事务下运行,即使是只读操作。

Transaction tx = session.beginTransaction();

常用方法:

Hibernate配置文件的两个配置项

hbm2ddl.auto:该属性可以帮助程序员实现正向工程。即由Java代码生成数据库脚本。进而生成具体的表结构。取值有create|update|create-drop|validate。

  • create:会根据*.hbm.xml生成数据表,但是每次运行都会删除上一次生成的表,重新生成表,哪怕两次没有任何改变。
  • create-drop:会根据*.hbm.xml生成数据表,但是SessionFactory一关闭,表就自动删除。
  • update:最常用的属性值。也不错会根据.hbm.xml生成数据表,但若.hbm.xml文件和数据库中对应的数据表结构不同,Hibernate将更新数据表的结构,但不会删除已有的行和列。
  • validate:会和数据库中的表进行比较。若*.hbm.xml文件中的列在数据表中不存在,则抛出异常。

format_sql:是否将SQL转化为格式良好的SQL,取值为true|false。

举报

相关推荐

0 条评论