`

hibernate4.0官方文档学习随笔

阅读更多
public class Event{
	Long id;
	String title;
	Date date;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}


<hibernate-mapping package="org.hibernate.tutorial.domain">
	<class name="Event" table="EVENTS">
		<id name="id" column="EVENTS_ID">
			<generator class="native"></generator>
		</id>
		<property name="date" type="timestamp" column="EVENTS_DATE"/>
		<property name="title"/>
	</class>
</hibernate-mapping>




关于实体映射文件中的type属性中指定的属性值,既不是java中的类型,也不是数据库中的数据类型,而是"Hibernate Mapping Types" 用于java类中属性的类型与数据库字段类型的映射。如果省略了type字段,hibernate将自动尝试用正确的类型去匹配。
另外hibernate官方文档中提示:在处理实体映射文件时如果省略type属性时hibernate将使用反射技术对类型尝试进行匹配,这是一个耗费资源和时间的操作,因此出于对性能和资源的影响,最好在映射文件的属性中都加入type属性。


========================================================================================================================================
hibernate.cfg.xml文件中关于session的配置
<!-- Enable Hibernate's automatic session context management -->
 <property name="current_session_context_class">thread</property>


获取current Session
Session  session = HibernateUtil.getSessionFactory().getCurrentSession();



调用getCurrentSession()方法总是返回"当前"的工作单元,这与hibernate.cfg.xml配置文件中(<property name="current_session_context_class">thread</property>
)是有关系的org.hibernate.Session被设计用来表示单一的工作单元,getCurrentSession()方法返回的session,将与当前的java线程绑定来处理相关的操作,当事务提交\结束\回滚时,hibernate会将该session自动与当前线程解除绑定并关闭,再次调用getCurrentSession()方法,返回的又是一个新的session(工作单元)
另外:在hibernate中提供了三种方式用于对current session 进行管理,配置文件中"thread"值的配置不建议在生产上使用,当前只是为了小的demo的演示,具体讲解放到后面


(1)增加一个Person对象 person中包含event
public class Person {
	private Long id;
	private int age;
	private String firstname;
	private String lastname;
	
	Set events = new HashSet();
//增加set\get方法
}

(2)配置文件
<class name="Person" table="PERSON">
    <id name="id" column="PERSON_ID">
        <generator class="native"/>
    </id>
    <property name="age"/>
    <property name="firstname"/>
    <property name="lastname"/>

    <set name="events" table="PERSON_EVENT">
        <key column="PERSON_ID"/>
        <many-to-many column="EVENT_ID" class="Event"/>
    </set>

</class>


(3)数据库表关系映射说明:


(4)测试
private void addPersonToEvent(Long personId, Long eventId) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Person aPerson = (Person) session.load(Person.class, personId);
        Event anEvent = (Event) session.load(Event.class, eventId);
        aPerson.getEvents().add(anEvent);

        session.getTransaction().commit();
}

测试说明:



通过上面的代码可以看到:我们不需要显式的执行update或者save方法,hibernate会自动探测到某些属性值发生变化了,需要更新,这叫做"automatic dirty checking" 只要数据处在"persistent stat"状态,会绑定一个当前独有的org.hibernate.Session对象,hibernate会监视任何的变化并在后台生成相关的SQL语句,在调用flushing/commit/rollback等方法后会进行内存与数据库的同步,把变化的数据持久化到数据库。

不同session下的测试:
private void addPersonToEvent(Long personId, Long eventId) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Person aPerson = (Person) session
                .createQuery("select p from Person p left join fetch p.events where p.id = :pid")
                .setParameter("pid", personId)
                .uniqueResult(); // Eager fetch the collection so we can use it detached
        Event anEvent = (Event) session.load(Event.class, eventId);

        session.getTransaction().commit();

        // End of first unit of work

        aPerson.getEvents().add(anEvent); // aPerson (and its collection) is detached

        // Begin second unit of work

        Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
        session2.beginTransaction();
        session2.update(aPerson); // Reattachment of aPerson

        session2.getTransaction().commit();
    }


说明:
You can load person and event in different units of work. Or you can modify an object outside of a org.hibernate.Session, when it is not in persistent state (if it was persistent before, this state is called detached). You can even modify a collection when it is detached:
The call to update makes a detached object persistent again by binding it to a new unit of work, so any modifications you made to it while detached can be saved to the database. This includes any modifications (additions/deletions) you made to a collection of that entity object.
我们可以通过不同的session来装载对象,我们可以在这个对象不是"persistent state"状态时修改对象,调用update方法可以使detached状态的对象持久(会将对象绑定到一个新的session); 所以对于detached对象的任何的修改对可以被持久化到数据库。


非实体关系的xml映射  Person类中增加如下属性代码
private Set emailAddresses = new HashSet();

    public Set getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(Set emailAddresses) {
        this.emailAddresses = emailAddresses;
    }

xml配置文件
        <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
            <key column="PERSON_ID"/>
            <element type="string" column="EMAIL_ADDR"/>
        </set>

数据库映射关系:





这次的映射跟上次的映射唯一不同是把many-to-mangy 改成了element,此配置告诉hibernate,增加的该collection不参考任何的其他实体。其他个标签中属性配置的意义与前面例子中的events映射相同。

双向映射: 结合上面Person中单项映射Event类例子来看下面的代码
Event类增加如下代码:
private Set emailAddresses = new HashSet();

    public Set getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(Set emailAddresses) {
        this.emailAddresses = emailAddresses;
    }

Event.hbm.xml代码
<set name="participants" table="PERSON_EVENT" inverse="true">
            <key column="EVENT_ID"/>
            <many-to-many column="PERSON_ID" class="Person"/>
        </set>

此处的核心是属性inverse的含义:






此处关于inverse的解释不是很清楚,后面文档中如有讲解到在进行补充。
  • 大小: 71.5 KB
  • 大小: 85.1 KB
  • 大小: 16.9 KB
  • 大小: 54.2 KB
  • 大小: 22.2 KB
  • 大小: 42.4 KB
  • 大小: 35.5 KB
  • 大小: 140.1 KB
分享到:
评论

相关推荐

    Hibernate4.0中文文档

    《Hibernate4.0中文文档》是针对Java开发者的重要参考资料,它详尽地介绍了Hibernate框架在4.0版本中的各项功能和使用方法。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间...

    hibernate4.0帮助文档

    最新版本的hibernate4.0帮助文档,学习hibernate的必备文档

    DmDialect-for-hibernate4.0.zip

    本篇将详细介绍标题为"DmDialect-for-hibernate4.0.zip"的压缩包文件及其包含的两个重要组件:Dm7JdbcDriver17.jar和DmDialect-for-hibernate4.0.jar,以及它们在SpringBoot项目中的作用。 首先,SpringBoot是一个...

    hibernate4.0项目与hibernate4.0全套JAR包

    Hibernate是一个非常优秀的,成熟的ORM框架,可以在不用写SQL语句的情况下,仅仅对持久化对象进行操作便可以完成对数据库的操作,可以使开发者更为专注于业务代码的编写,提高了开发效率,相对于JDBC而言,大大简化...

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    Hibernate4.0注解配置详解.docx

    Hibernate4.0注解配置详解,Hibernate4.0注解配置详解,Hibernate4.0注解配置详解

    hibernate4.0

    `dom4j-1.6.1.jar`是处理XML文档的库,Hibernate使用它来读取和写入XML格式的配置文件,如hibernate.cfg.xml。此外,`jandex-1.1.0.Final.jar`是用于Java元数据索引的库,提高Hibernate的反射性能,尤其在处理大量的...

    api.rar_dom4j api_hibernate 4.0 chm_hibernate4 api chm

    Hibernate 4.0.chm文档是学习和掌握这一版本的关键,它提供了关于配置、实体管理、查询语言(HQL)及事务处理等全面的指南。 Hibernate Annotation是Hibernate的一部分,它允许开发者使用注解来定义对象关系映射,...

    Spring4.0+Hibernate4.0+SpringMVC4.0整合框架

    Spring4.0、SpringMVC4.0和Hibernate4.0是Java开发中非常重要的三个框架,它们分别在依赖注入、MVC应用和对象关系映射方面提供了强大的支持。SSH4整合框架是这三个组件的集成,旨在提升企业级应用的开发效率和可维护...

    myeclips10对springmvc4.0+hibernate4.0的完整crud

    【标题】"myeclips10对springmvc4.0+hibernate4.0的完整crud"指的是使用MyEclipse 10这个集成开发环境来构建一个基于Spring MVC 4.0和Hibernate 4.0的全功能CRUD(创建、读取、更新、删除)应用程序。在这样的系统中...

    SpringMvc(4.0)+hibernate(4.0)

    在这个项目中,Hibernate 4.0 被用来管理数据库操作,包括创建、读取、更新和删除(CRUD)数据,通过 Session 和 Transaction API 进行事务处理。 【项目结构】 项目结构通常包含以下几个部分: 1. src/main/java:...

    Hibernate4.0

    ### Hibernate 4.0 使用中的常见错误解析与应对策略 #### ServiceRegistry的引入与使用 在Hibernate 4.0版本中,对原有的架构进行了重大的调整,其中最显著的变化之一便是`ServiceRegistry`的引入。这标志着从...

    spring3.2+hibernate4.0整合

    Spring3.2与Hibernate4.0的整合是许多开发者在构建现代Java Web应用时会选择的技术栈,因为它们可以提供强大的依赖注入、事务管理以及持久化能力。下面将详细阐述这两个框架的整合过程及其相关知识点。 **Spring...

    spring4.0和hibernate4.0整合框架

    spring4.0和hibernate4.0框架的标准整合,此框架实现了hibernate根据实体自动创建表(前提是你要在mysql中创建名为testspring的库),spring的aop拦截功能,帮助了解aop,和spring事物控制,异常回滚以及junit4的测试...

    Hibernate4.0,Hibernate5.2,Hibernate5.6 jar包

    首先,让我们详细了解一下Hibernate4.0。在这一版本中,Hibernate引入了一些重要的改进和新特性。例如,对JPA 2.0规范的全面支持,使得开发者能够更方便地利用Java持久化API。此外,还增强了对批处理操作的支持,...

    SpringMVC4.0 + Hibernate4.0 + 验证码 + 邮箱 + Log4j.rar

    《SpringMVC4.0 + Hibernate4.0 + 验证码 + 邮箱 + Log4j:构建高效Web应用程序》 在Web开发领域,SpringMVC、Hibernate、验证码和邮箱服务是不可或缺的重要组件。这个项目集成了这些技术,为开发者提供了一个完整...

    Hibernate 4.0版HelloWorld

    **Hibernate 4.0版HelloWorld** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者...通过这个项目,开发者可以学习到如何在实际开发中运用Hibernate进行数据库操作。

    hibernate 4.0

    - **丰富的API文档**:提供了详尽的API文档,方便开发者查阅和学习。 - **活跃的社区**:Hibernate拥有庞大的开发者社区,用户可以通过论坛、邮件列表等方式获得帮助和解决问题。 总的来说,Hibernate 4.0 的发布...

    Spring4.0_Hibernate4.0_Struts2.3整合配置文件

    Spring4.0和_Hibernate4.0加上_Struts2.3整合的配置文件

Global site tag (gtag.js) - Google Analytics