Hibernate学习笔记

RK3308B开发板WiFi+蓝牙一体模组RTL8821CS驱动移植保姆级教程(含DTS配置与避坑点) 本文提供RK3308B开发板RTL8821CS WiFi+蓝牙模组驱动移植的完整教程,涵盖SDK环境配置、DTS设备树设置、内核编译优化及功能验证全流程。重点解析引脚复用冲突、电源管理等关键配置,并给出常见错误解决方案,帮助开发者快速实现双模通信功能。 阅读详情

大小写不敏感

持久化类一般被定义为JavaBean,这是推荐的设计,但是并不是必须的。Hibernate也可以直接访问这些field。

所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。

映射文件

一个映射文件看起来像这样

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

用生命来证明(很感人的哦) - 小次子大头 - ┛,.转角 ; 遇到愛 〣    <class name="events.Event" table="EVENTS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" column="EVENT_ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="native"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="date" type="timestamp" column="EVENT_DATE"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="title"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

class元素代表要持久化的类以及它对应的数据表(一般情况下一个类对应一个表)

id元素中的name属性代表持久化类的标识符,而column则代表对应表中的主键。除此之外我们还要用generrator属性定义标识符的生成策略。

property属性用于映射持久化类的字段。有时候你需要手工指定转换成为的数据库数据类型以及数据表

Hibernate配置

配置Hibernate的工作就是配置hibernate.properties或者hibernate.cfg.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.cfg.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<?xml version='1.0' encoding='utf-8'?>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<!DOCTYPE hibernate-configuration PUBLIC

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-configuration>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <session-factory>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- Database connection settings -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="connection.username">sa</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="connection.password"></property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- JDBC connection pool (use the built-in) -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="connection.pool_size">1</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- SQL dialect -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- Enable Hibernate's automatic session context management -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="current_session_context_class">thread</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- Disable the second-level cache  -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- Echo all executed SQL to stdout -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="show_sql">true</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <!-- Drop and re-create the database schema on startup -->

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="hbm2ddl.auto">create</property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <mapping resource="events/Event.hbm.xml"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </session-factory>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-configuration>

在这里,我们配置了Hibernate的SessionFactory-一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的<session-factory>,通常把它们放在多个配置文件中(为了更容易启动)。

用Ant来构建程序 

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客build.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<project name="hibernate-tutorial" default="compile">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <property name="sourcedir" value="${basedir}/src"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <property name="targetdir" value="${basedir}/bin"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <property name="librarydir" value="${basedir}/lib"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <path id="libraries">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <fileset dir="${librarydir}">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <include name="*.jar"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </fileset>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </path>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <target name="clean">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <delete dir="${targetdir}"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <mkdir dir="${targetdir}"/>

2007年10月1日 - mnhzhang - mnhzhang的博客    </target>

2007年10月1日 - mnhzhang - mnhzhang的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <target name="compile" depends="clean, copy-resources">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客      <javac srcdir="${sourcedir}"

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客             destdir="${targetdir}"

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客             classpathref="libraries"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </target>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <target name="copy-resources">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <copy todir="${targetdir}">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <fileset dir="${sourcedir}">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                <exclude name="**/*.java"/>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            </fileset>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </copy>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </target>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</project>

启动和辅助类

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Session session = sessionFactory.getCurrentSession()

  映射 

理解对象标识符

映射组合

细粒度对象模型

Hibernate项目的主要目标之一就是支持细粒度模型,

实体类型和值类型Entity and value type

实体类型:一个实体类型对象拥有它自己的数据库标识符(primary key值),一个被实体引用的对象以一个引用的方式持久化在一个数据库中(a foreign key value)。一个实体拥有它自己的生命周期;它相对于其他实体独立存在。

值类型:一个值类型对象没有数据库标识符;它属于一个实体,并且它的持久化状态是嵌入到属主实体的数据表行中(除了集合类型以外,)值类型没有标识符或者标识符参数。值类型实例的生命周期绑定在它的属主实体上。

建立关系数据库模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系。

映射组合关系就是指多个类对应一个表的映射。如Address、Customer类对应CUSTOMER表。

主要通过<component>元素来完成的。

映射继承关系

数据表之间并不存在继承关系,如何映射类间的继承关系呢?有三种方法:

1.每一个具体类对应一个表table-per-concrete-class

2.整个继承层次对应一个表table-per-class-hierarchy

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="BillingDetails" table="BILLING_DETAILS" discriminator-value="BD">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" column="BILLING_DETAILS_ID" type="long">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="native" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <discriminator column="BILLING_DETAILS_TYPE" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="name" column="OWNER" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <subclass name="CreditCard" discriminator-value="CC">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <property name="type" column="CREDIT_CARD_TYPE" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </subclass>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

<discriminator>

<subclass>

3.每个子类对应一个表table-per-subclass

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<?xml version="1.0"?>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="BillingDetails" table="BILLING_DETAILS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" column="BILLING_DETAILS_ID" type="long">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="native" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="owner" column="OWNER" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <joined-subclass name="CreditCard" table="CREDIT_CARD">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <key column="CREDIT_CARD_ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                <property name="type" column="TYPE" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </joined-subclass>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

<joined-subclass>

选择一个继承策略

1.如果不需要支持多态关联以及多态查询,倾向于使用table-per-concrete-class

2.如果需要多态关联和多态查询,并且子类包含的属性不多,倾向于使用table-per-class-hierarchy

3.如果需要多态关联和多态查询,而子类包含的属性很多,倾向于使用table-per-subclass

映射关联关系

一对一关联One-to-one associations

Hibernate提供了两种一对一关联关系的方法:

1. 使用(唯一)外键来关联Using a foreign key association

最简单的方法表现一对一关联是在外键上使用带有unique约束的<many-to-one>映射。

为什么要用many-to-one呢?实际上唯一外键关联的一对一关系只是多对一关系的一个特例而已。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Customer.java

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客public class Customer implements Serializable 上街了,贴几张照片给你看 - jilan-zheng - 秋雨的博客{

上街了,贴几张照片给你看 - jilan-zheng - 秋雨的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    private Address homeAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    private Address comAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public mypack.Address getHomeAddress() Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        return this.homeAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public void setHomeAddress(mypack.Address homeAddress) Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        this.homeAddress = homeAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public mypack.Address getComAddress() Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        return this.comAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public void setComAddress(mypack.Address comAddress) Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        this.comAddress = comAddress;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客}

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Customer.hbm.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Customer" table="CUSTOMERS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="name" column="NAME" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <many-to-one name="homeAddress" class="mypack.Address" column="HOME_ADDRESS_ID" cascade="all" unique="true" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <many-to-one name="comAddress" class="mypack.Address" column="COM_ADDRESS_ID" cascade="all" unique="true" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

为了实现双向一对一关系,我们

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Address.java

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客public class Address implements Serializable Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    private Customer customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public mypack.Customer getCustomer() Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        return this.customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public void setCustomer(mypack.Customer customer) Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        this.customer = customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客}

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Address.hbm.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Address" table="ADDRESSES">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="city" column="CITY" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="province" column="PROVINCE" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="street" column="STREET" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="zipcode" column="ZIPCODE" type="string" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <one-to-one name="customer" class="mypack.Customer" property-ref="homeAddress" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

2.使用主键来关联Using a primary key association

多对一单向关联many-to-One associations

Customer类是one,按照普通类来定义并映射,无需定义Orader对象的集合属性。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客public class Customer implements Serializable Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客}

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Customer" table="CUSTOMERS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="name" type="string">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <column name="NAME" length="15" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

Orader类是many,Orader类中需要定义一个customer属性

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客public class Order implements Serializable Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    private mypack.Customer customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public mypack.Customer getCustomer() Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        return this.customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public void setCustomer(mypack.Customer customer) Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        this.customer = customer;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客}

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Order" table="ORDERS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="orderNumber" type="string">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <column name="ORDER_NUMBER" length="15" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <many-to-one name="customer" column="CUSTOMER_ID" class="mypack.Customer" not-null="true" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

一对多双向关联One-to-many associations

在双向关联中,我们既可以从Orader对象中得到它所属的Customer,亦可从Customer中获得它所关联的所有Order。

这时候,我们需要在Customer类中增加一个集合类型的Orders属性。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Customer.java

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客public class Customer implements Serializable Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    private Set orders;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public Set getOrders() Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        return this.orders;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    public void setOrders(Set orders) Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客{

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        this.orders = orders;

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    }

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客}

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Customer.hbm.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Customer" table="CUSTOMERS">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="name" type="string">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <column name="NAME" length="15" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <set name="orders" inverse="true" cascade="save-update">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <key column="CUSTOMER_ID" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <one-to-many class="mypack.Order" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </set>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

一对多双向自关联

同一个类既扮演了one的角色,又扮演了many的角色。典型的应用案例就是一个种类分层模型。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Category.hbm.xml

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<hibernate-mapping>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    <class name="mypack.Category" table="CATEGORIES">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <id name="id" type="long" column="ID">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <generator class="increment" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </id>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <property name="name" type="string">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <column name="NAME" length="15" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </property>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <set name="childCategories" cascade="save-update" inverse="true">

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <key column="CATEGORY_ID" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            <one-to-many class="mypack.Category" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        </set>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        <many-to-one name="parentCategory" column="CATEGORY_ID" class="mypack.Category" />

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    </class>

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客</hibernate-mapping>

多对多关联Many-to-many associations

多对多关联由于性能不佳,因此设计中应尽量避免使用。

单向多对多关联A unidirectional many-to-many association

双向多对多关联A bidirectional many-to-many association

使用组件集合的多对多关联Using a collection of components for a many-to-many association

所有的多对多关联都可以分解为两个一对多关联,按照这种方式映射多对多关联,会使域模型和关系数据模型具有更好的可扩展性。

Hibernate的映射类型

Java程序的数据类型往往和数据库的数据类型是不匹配的,你如何将一个JDK的Interger类型保存为数据库的VARCHAR类型呢?或者你AttachFileName类型存入数据库中去?有两种方法,一种是你将AttachFileName类型分解成为数据库中的类型,这样每次读取和写入的时候你都要做一个转换,比较麻烦。并且使得你的领域模型紧密的耦合在物理数据库模型上。

另一种方法就是,实现一个UserType,透明化的将AttachFileName保持在数据库中。

为什么需要客户化映射类型?

如何实现?

Hibernate提供两个客户友好的接口

UserType http://www.hibernate.org/hib_docs/v3/api/org/hibernate/usertype/UserType.html

实现UserType接口要实现以下几个方法

sqlType():指定映射到数据库中的类型

returnedClass():指定返回的Java类型

nullSafeGet():DB->Java的转换

nullSafeSet():Java->DB转换

assemble():

disassemble():

replace():

内置映射类型

客户化映射类型

UserType:

CompositeUserType:不仅可以完成和UserType相同的功能,而且还提供了对HQL的支持。

映射值类型的集合

映射多态关联

Polymorphic many-to-one associations

Polymorphic collections

Polymorphic associations and table-per-concrete-class

   检索对象  

Hibernate检索对象的方式:

1.定位对象图方式:

根据已加载的对象,通过其属性存取方法(getter)来加载其关联的其他对象。如:

aUser.getAddress().getCity()

2.根据对象标识符来检索:

当已经知道需要加载对象的唯一标识符时,这是一个便利且高效的方法。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客User user = (User) session.get(User.class, userID);

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客User user = (User) session.load(User.class, userID);

load()方法是比较旧的,get()

在get()和load()间作出选择是很容易的:如果你确定持久化对象存在,并且不考虑异常,load()将是好的选项。

3.HQL:

它是一个完全面向对象的查询语言。提供了最完整的查询功能。

HQL类似于OQL和EJB-QL,但是它不像OQL,HQL适合使用在数据库环境中,并且比EJB-QL功能更强大且优雅。

HQL仅用于对象的检索,而不负责插入、更新以及删除之类的工作。对象状态同步是持久化管理者的工作,而不是开发者。

Session类的find()方法及Query接口都支持HQL检索方式。这两者区别在于:前者只是执行一些简单HQL查询语句的便捷方法,不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,find()有可能会被淘汰;而Query接口才是真正的HQL查询接口,它提供了完整的查询功能。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客HQL

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Query q = session.createQuery("from User u where u.firstname = :fname");

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客q.setString("fname", "Max");

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客List result = q.list();

4.使用Criteria API:

QBC让你可以在运行时期建立一个query,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成语句。

QBC:

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客QBC

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Criteria criteria = session.createCriteria(User.class);

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客criteria.add( Expression.like("firstname", "Max") );

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客List result = criteria.list();

QBE:

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客QBE

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客User exampleUser = new User();

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客exampleUser.setFirstname("Max");

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Criteria criteria = session.createCriteria(User.class);

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客criteria.add( Example.create(exampleUser) );

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客List result = criteria.list();

5.使用本地SQL查询:

HQL和Criteria检索方式生成标准的SQL查询语句,适用于所有数据库平台,因此这两种检索方式都是跨平台的。

有时你需要使用底层数据库的SQL方言,来生成一些特殊的查询。这时候你就需要使用本地SQL检索方式了。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客本地SQL检索

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        //创建Query对象

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        Query query=session.createSQLQuery(

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            "select {c.*} from CUSTOMERS c where c.NAME like :customerName"

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            +"and c.AGE=:customerName","c",Customer.class);

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        //动态绑定参数

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        query.setString("cutomerName","T%");

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        query.setInteger("cutomerAge",21);

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        //执行SQL select语句,返回查询结果

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        List result=query.list();

在你的Hibernate应用程序中,可以联合使用以上的检索技术。

检索策略

Hibernate允许你在关联元数据或者运行时选择以下四中检索策略之一:

1. 立即检索Immediate fetching

立即检索关联对象,连续地读取数据库(或者查找缓存)。

2. 延迟检索Lazy fetching

关联对象或者集合在它们第一次被访问的时候才被加载。

我们推荐,在一开始的时候,将所有的关联配置成延迟(或者批量延迟)检索在映射文件中。这个策略可以在运行的时候修改成为迫切检索。

在运行session.load()方法的时候,Hibernate不执行任何select语句,仅仅返回一个动态生成的代理类而已。

值得注意的是:延迟检索对get()和find()方法不管用。

3. 迫切(外连接)检索Eager (outer join) fetching

迫切检索让你可以明确地指定哪些关联对象应该和它的引用对象一起被导入。Hibernate可以利用SQL OUTER JOIN在单次数据库查询中返回关联对象,

要点:使用外连接,明确指定应该立即加载哪些对象。

优点:减少select语句的数量、可以控制哪些对象应该立即加载。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客select c.ID,o.CUSTOMER,c.NAME,o.ID ORDER_ID,ORDER_NUMBER 

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客from CUSTOMERS c inner join ORDER o on c.ID=o.CUTOMER_ID;

4. 批量检索Batch fetching

批量检索不是严格意义上的关联检索策略。它是一项旨在提高延迟检索和立即检索性能的技术。通常,当你导入一个对象或者集合的时候,你的SQL Where字句指定对象标识符或者拥有对象的集合。如果批量检索是被允许的话,Hibernate将会查看有哪些代理实例或者未初始化集合是被当前session所引用的并且试图使用where子句中使用多重标识符值的方法来导入它们。

我们并不热衷于这种方法;因为迫切检索通常比它更快。批量检索对于那些想要提高系统性能但又不想思考太多优化SQL执行的初学者很有用。

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客select * from CUSTOMERS where ID=1 or ID=2 or ID=3 or ID=4;

选择一个检索策略

Hibernate允许你在映射文件中指定一个默认的关联检索策略,在query方法中你可以覆盖这默认的策略。

我们建议你首先看一下大概,当你要优化你程序的查询的时候才使用这个片段。

单点关联情况下的设置

对于一对一或者多对一关联,

outer-join有三种可能值:

outer-join="auto"

outer-join="true"

outer-join="false"

集合的设置

Neither attribute specified

outer-join="true"

lazy="true"

设置检索深度

如果select语句中的外连接表数目太多,会影响检索性能,此时可以通过在Hibernate.properties文件中设置检索深度:

hibernate.max_fetch_depth=1  #只允许外连接一张表

初始化延迟关联

有效地检索对象

执行查询

查询接口

createQuery()、createSQLQuery()和createCriteria()

分页查询

Query:

query.setFirstResult(0);   //设置

query.setMaxResults(10);

Criteria:

crit.setFirstResult(40);

crit.setMaxResults(20);

列出以及迭代结果

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客List result = session.createQuery("from User").list();

结果只有一个的情况:

有些情况下,我们知道结果只有一个——例如,我们想要知道最高的价格。

result.get(0) 或者setMaxResult(1).

uniqueResult()

Session.find() 比Query.list()更快吗?

find()只是提供简化的查询方法。

没有一个比另一个更快,推荐使用Query API

对象的基本查询Basic queries for objects

绑定参数Binding parameters

使用命名参数

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        String queryString =

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客            "from Item item where item.description like :searchString";

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        List result = session.createQuery(queryString)

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                             .setString("searchString", searchString)

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                             .list();

使用占位参数

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        String queryString = "from Item item "

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                + "where item.description like ? " + "and item.date > ?";

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客        List result = session.createQuery(queryString).setString(0,

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客                searchString).setDate(1, minDate).list();

使用命名查询

有时候你并不想把HQL查询语句写死到Java类中,这时你可以使用命名查询,将HQL语句写到XML文件中。

定义命名查询

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客<query name="findItemsByDescription"><![CDATA[

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客from Item item where item.description like :description

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客]]></query>

调用命名查询

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客session.getNamedQuery("findItemsByDescription")

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.setString("description", description)

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客.list();

基本对象查询

简单查询

使用别名

多态查询

约束

比较操作

字符串匹配

逻辑操作

结果排序

连接查询

连接查询

交叉连接

inner join(内连接)

left outer join(左外连接)

right outer join(右外连接)

full join (全连接,并不常用)

报表查询

Criteria并不适合做报表查询,所有在这里我们只谈HQL

使用聚集函数

分组查询

使用having字句来限制分组

高级查询技术

检索对象性能优化

解决需要 n+1 次select的问题

事务、并发和缓存

你应该使用哪一种自动提交模式?

理解数据库事务

JDBC和JTA

JDBC事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库

分布式事务:使用JTA

JTA不仅仅应用在分布式事务中,它也用在CMT环境下。

在一个标准的单机程序或者基于web的程序中,只有jdbc事务操作是可用的。

在应用服务器中,Hibernate可以使用JTA,

Hibernate事务提供了JDBC以及JTA的抽象层。Hibernate允许扩展,所以你甚至可以插入一个CORBA事务服务适配器。

使用应用程序事务来工作

缓存理论和实践

开发实战

数据操纵

持久化的生命周期

临时对象

持久化对象

游离对象

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客

对象标识符的范围

标识符范围的外表

实现equals() 和hashCode()

在Hibernate中使用可传递持久性

持久化的可达性

级联持久化

cascade="none":忽略关联

cascade="save-update":

cascade="delete"

cascade="all" 

cascade="all-delete-orphan"

cascade="delete-orphan"

管理自身关联

临时对象和游离对象的区别

Hibernate API

核心接口

Session interface

SessionFactory interface

Configuration interface

Transaction interface

Query and Criteria interfaces

Callback interfaces

扩展接口

Primary key generation (IdentifierGenerator interface)

SQL dialect support (Dialect abstract class)

Caching strategies (Cache and CacheProvider interfaces)

JDBC connection management (ConnectionProvider interface)

Transaction management (TransactionFactory, Transaction, and TransactionManagerLookup interfaces)

ORM strategies (ClassPersister interface hierarchy)

Property access strategies (PropertyAccessor interface)

Proxy creation (ProxyFactory interface)

Hibernate API使用步骤

1)获得Configuration

方法一:

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Configuration cfg = new Configuration()

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    .addResource("Item.hbm.xml")

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    .addResource("Bid.hbm.xml");

方法二:

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Configuration cfg = new Configuration()

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    .addClass(org.hibernate.auction.Item.class)

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客    .addClass(org.hibernate.auction.Bid.class);

2)获得SessionFactory

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客SessionFactory sessions = cfg.buildSessionFactory();

3)获得Session

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客Session session = sessions.openSession(); // open a new Session

事务策略配置

有三个标准(内建)的选择:

org.hibernate.transaction.JDBCTransactionFactory

委托给数据库(JDBC)事务(默认)

org.hibernate.transaction.JTATransactionFactory

如果在上下文环境中存在运行着的事务(如, EJB会话Bean的方法), 则委托给容器管理的事务, 否则,将启动一个新的事务,并使用Bean管理的事务.

org.hibernate.transaction.CMTTransactionFactory

委托给容器管理的JTA事务

实例的状态

临时对象

持久化对象

游离对象

Hibernate开发步骤

1.定义hibernate.properties

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.connection.driver_class=com.mysql.jdbc.Driver

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.connection.username=root

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.connection.password=root

Hibernate学习笔记  - qingfengxia2 - 清风幻影的博客hibernate.show_sql=true

2.创建持久化类

对这个持久化类的要求:

a.通常持久化类都符合JavaBean规范,但这不是必须的。

b.对于分布式结构的Java应用,持久化类还必须实现Serialzable接口。

c.必须提供一个不带参数的默认构造器。

d.不要引入任何Hibernate API(这是建议,为了提高持久化类的独立性)

3.创建数据库Schema

4.建立映射文件

5.通过Hibernate API操纵数据库

Session常用方法

save():临时对象持久化对象

update():游离对象持久化对象

SaveOrUpdate():both save() and update()

load()和get():

delete():

Clear()/Close():

beginTransaction():开始一个Hibernate编程事务

编写Hibernate应用程序

设计分层应用

在Servlet容器中使用Hibernate

在EJB容器中使用Hibernate

 

实现应用程序事务

Are application transactions really transactions?应用程序事务是真正的事务?

使用游离持久化对象

使用长会话

选择一个应用程序事务的途径

操纵特殊类型的数据

遗留schema和组合键

使用自然键来映射一个表

使用客户类型来映射遗留数据列

和触发器一起工作

审计日志

Hibernate建模方式

面向数据库建模:建模得到数据库模型schema,然后使用middlengen、hbm2java这样的工具得到hbm和类

面向对象建模:建模出类,然后通过xdoclet或者schemaupdate、hbm2dll这样的工具生成hbm以及schema.

hbm文件是支持重载的,

h3带来的annotation

E-R建模:

Middlegen

对象建模:

对象建模有两种方法,都以XDoclet为核心。

1.用Rose/Together生成类框架,附加XDoclet描述,然后通过xdoclet生成hbm文件。

2.使用andromda:将对象建模生成的模型导出为XML,然后用andromda的Hibernate转换成附带有xdoclet的POJO,同时生成hbm。

Hibernate实用工具

hbm2ddl

hbm2java

Hibernate3升级Hibernate2注意事项

SCCM部署教程:(3)SCCM安装 这两则摘要介绍了WSUS和SCCM的安装步骤: WSUS安装:通过服务器管理器添加"Windows服务器更新服务"角色,选择SQL数据库并指定安装路径,验证数据库连接后完成安装。 SCCM安装:先运行预检工具Prereqchk.exe,选择主站点安装类型,配置语言、站点代码和名称,设置SQL数据库连接参数(保留默认端口4022),选择通信方法和系统角色(管理点和分发点),最后完成约1小时的安装过程。 两则安装指南都强调要确保数据库配置与前期准备一致,并提供了关键配置选项的说明。 阅读详情

相关推荐

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4500

Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系

常见的映射对应关系如下表所示: Hibernate映射类型 Java类型 标准SQL类型 字节大小 integer/int java.lang.Integer/int INTEGER 4Byte long java.lang.Long/long BIGINT 8Byte short java.lang.Short/short SMALLINT 2Byte byte ja...

小小默:进无止境 4059

LTE信令流程——切换

LTE信令流程 切换 切换是由基站发起的,不同于小区重选,小区重选是由UE发起的。 基站利用移动性管理算法给UE下发测量任务,在RRC重配置消息中携带MeasConfig信元给UE下发测量配置 切换有三种场景: 同一基站内不同小区的切换 不同基站间基于X2的切换(MME不变) 不同基站间基于S1的切换(MME/SGW可能改变) 1. 同一基站内不同小区的切换 连接态的UE在一个基站的不同小区之间移动 UE上报合适的测量报告(Measure Reports),触发基站切换 基站下发切换命令给UE,

Hxx的博客 1万+

hibernate-mapping的各种属性配置

先给出一份常见的持久化类配置文件大概熟悉一下 <strong><spanstyle="font-size: 18px;"><hibernate-mapping> <classname="zyw.app.domain.Person1"> <idname="id"type="java.lang.Integer"> <generatorclass="identity"/> ...

jamesge的博客 1513

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

zerorzeror的博客 3118

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

Hibernate系列---(一)入门及映射文件配置

一、Hibernate Hibernate简介: Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。 Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。 Hiberna...

Double____C的博客 844

保姆级教程:手把手配置MAX9295/9296 GMSL2-CSI2链路,搞定4LAN/1LAN模式与常见调试

本文提供MAX9295/9296 GMSL2-CSI2链路的详细配置教程,涵盖4LAN和1LAN模式的硬件连接、寄存器配置及调试技巧。通过实战案例和代码示例,帮助开发者快速实现高带宽视频传输,解决常见问题如信号同步和功耗优化,适用于车载摄像头和机器人视觉系统开发。

weixin_42561143的博客 434

hibernate配置详解<转>

&lt;meta&gt;元素的属性 属性 描述 class-description 指定描述类的javaDoc field-description 指定描述类的属性javaDoc interface 如果为true,表明生成接口而非类,默认false implements 指定类所实现的接口 extends 指定继承的父类名 generate...

人生如梦 梦如人生 180

从零构建机械臂规划栈:Pinocchio、OMPL与Ruckig的工程化融合实践

本文详细介绍了如何从零构建机械臂规划栈,通过融合Pinocchio、OMPL和Ruckig三大核心组件,实现高性能的机械臂运动规划与轨迹生成。文章深入探讨了技术选型、工程架构设计及实战优化技巧,特别针对逆解、路径规划和轨迹平滑等关键环节提供了实用解决方案,适用于工业场景中的高实时性需求。

weixin_29072299的博客 433

Debian 11 下用hostapd+dnsmasq搭建WiFi热点:从命令行到实战(避坑指南)

本文详细介绍了在Debian 11系统上,使用hostapd和dnsmasq从命令行搭建稳定WiFi热点的完整实战流程。内容涵盖环境准备、无线网卡AP模式检查、服务深度配置,并重点提供了从服务启动失败到客户端无法上网等常见问题的系统性排错指南,帮助用户避开配置陷阱,成功创建可用的无线接入点。

CAT789的专栏 773

Hibernate的映射关系的基本配置

根元素的子元素,用以定义一个持久化类与数据表的映射关系,如下是该元素包含的一些可选的属性。用于在联合子类中标识抽象的超类(默认值为false)

学习笔记,人工智能,教程,技术分享! 985

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南

本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。

weixin_42562079的博客 423

hibernate学习笔记

hibernate学习笔记

congine_mcfeng的专栏 158

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Hibernate马士兵学习笔记

Hibernate马士兵学习笔记

lishuanglearn的博客 324

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Rhyme/Hibernate 完整学习笔记

hibernate学习笔记有道云笔记

RhymeChiang 436

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Hibernate Annotation学习笔记

学习笔记

baobeituping的专栏 130

Hibernate 4 学习笔记

  Hibernate 4 学习笔记 现在附件中

上善若水,厚德载物 147

Hibernate学习笔记总结

**框架和CRM项目的整体介绍** 1. 什么是CRM * CRM(Customer Relationship Management)客户关系管理,是利用相应的信息技术以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,向客户提供创新式的个性化的客户交互和服务的过程 * 其最终目标是将面向客户的各项信息和活动集成起来,组建一个以客户为中心的企业,实现对面向客户的活动的全面管理 2....

夏桑菊泡面 469

Hibernate annotaion学习笔记

学习笔记为doc格式。分享给大家  

wjt276的专栏 135

Hibernate学习笔记(一)——简单的Hibernate实例入门

一、Hibernate简介 Hibernate是一个开源的对象/关系映射(ORM)框架,它对JDBC进行了轻量级的封装。所谓ORM就是Object/Relationship Mapping,为什么要使用对象/关系映射呢?因为使用面向对象思想编写的数据库应用程序都是要把信息存储到关系型数据库中的,使用Hibernate就可以使用面向对象的方法来操作和使用数据库了。 二、Hibernate简单实例

记录只为更好地前行 5467

Hibernate3.3.2 xml学习笔记

Hibernate3.3.2 xml学习笔记,请大家下载附件  

wjt276的专栏 160
上一篇: Hibernate 本地SQL查询SQLQuery
下一篇: oracle监听不能启动的问题及处理过程!
飞飞的魔毯小窝
博客等级 码龄14年 12粉丝 735原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值