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中文文档》是针对Java开发者的重要参考资料,它详尽地介绍了Hibernate框架在4.0版本中的各项功能和使用方法。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间...
最新版本的hibernate4.0帮助文档,学习hibernate的必备文档
本篇将详细介绍标题为"DmDialect-for-hibernate4.0.zip"的压缩包文件及其包含的两个重要组件:Dm7JdbcDriver17.jar和DmDialect-for-hibernate4.0.jar,以及它们在SpringBoot项目中的作用。 首先,SpringBoot是一个...
Hibernate是一个非常优秀的,成熟的ORM框架,可以在不用写SQL语句的情况下,仅仅对持久化对象进行操作便可以完成对数据库的操作,可以使开发者更为专注于业务代码的编写,提高了开发效率,相对于JDBC而言,大大简化...
Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
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的反射性能,尤其在处理大量的...
Hibernate 4.0.chm文档是学习和掌握这一版本的关键,它提供了关于配置、实体管理、查询语言(HQL)及事务处理等全面的指南。 Hibernate Annotation是Hibernate的一部分,它允许开发者使用注解来定义对象关系映射,...
Spring4.0、SpringMVC4.0和Hibernate4.0是Java开发中非常重要的三个框架,它们分别在依赖注入、MVC应用和对象关系映射方面提供了强大的支持。SSH4整合框架是这三个组件的集成,旨在提升企业级应用的开发效率和可维护...
【标题】"myeclips10对springmvc4.0+hibernate4.0的完整crud"指的是使用MyEclipse 10这个集成开发环境来构建一个基于Spring MVC 4.0和Hibernate 4.0的全功能CRUD(创建、读取、更新、删除)应用程序。在这样的系统中...
在这个项目中,Hibernate 4.0 被用来管理数据库操作,包括创建、读取、更新和删除(CRUD)数据,通过 Session 和 Transaction API 进行事务处理。 【项目结构】 项目结构通常包含以下几个部分: 1. src/main/java:...
### Hibernate 4.0 使用中的常见错误解析与应对策略 #### ServiceRegistry的引入与使用 在Hibernate 4.0版本中,对原有的架构进行了重大的调整,其中最显著的变化之一便是`ServiceRegistry`的引入。这标志着从...
Spring3.2与Hibernate4.0的整合是许多开发者在构建现代Java Web应用时会选择的技术栈,因为它们可以提供强大的依赖注入、事务管理以及持久化能力。下面将详细阐述这两个框架的整合过程及其相关知识点。 **Spring...
spring4.0和hibernate4.0框架的标准整合,此框架实现了hibernate根据实体自动创建表(前提是你要在mysql中创建名为testspring的库),spring的aop拦截功能,帮助了解aop,和spring事物控制,异常回滚以及junit4的测试...
首先,让我们详细了解一下Hibernate4.0。在这一版本中,Hibernate引入了一些重要的改进和新特性。例如,对JPA 2.0规范的全面支持,使得开发者能够更方便地利用Java持久化API。此外,还增强了对批处理操作的支持,...
《SpringMVC4.0 + Hibernate4.0 + 验证码 + 邮箱 + Log4j:构建高效Web应用程序》 在Web开发领域,SpringMVC、Hibernate、验证码和邮箱服务是不可或缺的重要组件。这个项目集成了这些技术,为开发者提供了一个完整...
**Hibernate 4.0版HelloWorld** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者...通过这个项目,开发者可以学习到如何在实际开发中运用Hibernate进行数据库操作。
- **丰富的API文档**:提供了详尽的API文档,方便开发者查阅和学习。 - **活跃的社区**:Hibernate拥有庞大的开发者社区,用户可以通过论坛、邮件列表等方式获得帮助和解决问题。 总的来说,Hibernate 4.0 的发布...
Spring4.0和_Hibernate4.0加上_Struts2.3整合的配置文件