`
zhouxianglh
  • 浏览: 269653 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(5)Hibernate中的many-to-many和并发

阅读更多

不想说什么,都是多余的.

 

 

Hibernate 因为中间涉及到数据库的操作,事务同步这些就是必须的.

1 Hibernate 中many-to-many 的相关操作.

2 Hibernate 中的数据隔离,Hibernate 中的乐观锁,悲观锁

3 HQL和SQL 的命名查询.

 

UserBO.hbm.xml如下:

<!-- dynamic-update="true" optimistic-lock="dirty" -->
<class name="com.isw2.bo.UserBO" table="t_user"
	catalog="many_to_many" lazy="true">
	<id name="userId" column="userId">
		<generator class="native"></generator>
	</id>
	<version name="version" column="version"></version>
        <!-- 时间戳最小时间1s 在此间发生的更改无法识别 -->
       	<!--  <timestamp name="" column=""></timestamp> -->
        <property name="userName" length="32" type="string"
		column="userName">
	</property>
	<!-- t_user_role_info 为中间表 -->
	<set name="roles" lazy="true" table="t_user_role_info" cascade="all" inverse="false">
		<key column="userId"></key>
		<many-to-many column="roleId" class="com.isw2.bo.RoleBO"></many-to-many>
	</set>
</class>
<!-- HQL 查询语句 -->
<query name="findUserBO">
		<![CDATA[from UserBO]]>
</query>
<!-- SQL查询语句,组装成对象 UserBO 放入 List -->
<sql-query name="findUserBOBySQL">
		<![CDATA[select userId {u.userId},userName {u.userName},version {u.version} from t_user]]>
		<return alias="u" class="com.isw2.bo.UserBO"></return>
</sql-query

 RoleBO.hbm.xml如下:

<class name="com.isw2.bo.RoleBO" table="t_role" catalog="many_to_many" lazy="true">
	<id name="roleId" column="roleId">
		<generator class="native"></generator>
	</id>

        <version name="version" column="version"></version>
 	<property name="roleName" column="roleName" type="string"
		length="32">
	</property>
	<set name="users" lazy="true" table="t_user_role_info" cascade="all" inverse="true">
		<key column="roleId"></key>
		<many-to-many class="com.isw2.bo.UserBO" column="userId"></many-to-many>
	</set>
</class>

 hibernate.cfg.xml如下:

<session-factory>
	<property name="connection.username">root</property>
	<property name="connection.url">
		jdbc:mysql://127.0.0.1:3306/many_to_many
	</property>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<property name="myeclipse.connection.profile">MySQL</property>
	<property name="connection.password">123456</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="show_sql">true</property>
	<!-- 设置全局隔离级别 -->
	<!-- 
		1读未提交级别(可能会脏读)
		2读已提交级别(不可重复读)
		4可重复读级别(幻读)
		8可串行化级别(死锁)
	-->
	<property name="hibernate.connection.isolation ">4</property>

	<mapping resource="com/isw2/bo/RoleBO.hbm.xml" />
	<mapping resource="com/isw2/bo/UserBO.hbm.xml" />

</session-factory>
 

相关的查询操作:

/**
 * 使用命名HQL查询
 */
public void findByHQL() {
	Session session = HibernateSessionFactory.getSession();
	Query query = session.getNamedQuery("findUserBO");
	List list = query.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.close();
}

/**
 * 使用命名SQL 查询
 */
public void findBySQL() {
	Session session = HibernateSessionFactory.getSession();
	// SQLQuery query = session.createSQLQuery("select userId
	// {ub.userId},userName {ub.userName} from t_user");
	// query.addEntity("ub",UserBO.class);
	Query query = session.getNamedQuery("findUserBOBySQL");
	List list = query.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.close();
}

/**
 * 查询中使用悲观锁
 */
public void findLock() {
	Session session = HibernateSessionFactory.getSession();
	/**
	 * Hibernate: select userbo0_.userId as userId2_0_, userbo0_.version as
	 * version2_0_, userbo0_.userName as userName2_0_ from
	 * many_to_many.t_user userbo0_ where userbo0_.userId=?  for update  因为
	 * 悲观锁LockMode.UPGRADE 查询语句通过 for update被锁定
	 */
	// UserBO userBO = (UserBO) session.load(UserBO.class, new Long(24),
	// LockMode.UPGRADE);
	// System.out.println(userBO);
	Query query = session.createQuery("select ub from UserBO ub");
	query.setLockMode("ub", LockMode.UPGRADE);
	List list = query.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.close();
}

 1 在many-to-many 中要注意的是 cascade , inverse 它们分别指出有哪些关系需要维护,这些关系由谁来维护.

在这里有一张中间表"t_user_role_info" 用于存放many-to-many 关系.

 

2 关于数据隔离。

<!-- 设置全局隔离级别 -->
		<!-- 
			1读未提交级别(可能会脏读)
			2读已提交级别(不可重复读)
			4可重复读级别(幻读)
			8可串行化级别(死锁)
		-->
		<property name="hibernate.connection.isolation ">4</property>

 这里可串行化级别,隔离性能最好,但易死锁,而且很消耗数据库性能。建议使用4

 

3 关于乐观锁. 它有三种方式version(标注版本),timestamp(时间戳,1s 内的变更无法识别),这两个都需要数据库及对象中有相关字段支持。dynamic-update="true" optimistic-lock="dirty"  通过对比更新前字段值判断是否被更改。

 

4 悲观锁。乐观锁假设数据不会被更改,而悲观锁则相反。它会利用数据库的锁机制实现。比如:

select userbo0_.userId as userId2_0_ ....for update

 即在MySQL的查询过程中锁定数据.

分享到:
评论

相关推荐

    Hibernate one to many(many to one) 配置

    标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...

    hibernate映射篇

    在本篇文章中,我们将深入探讨Hibernate中的几种关联映射,包括多对一(Many-to-One)、一对一(One-to-One)以及一对多(One-to-Many)映射。 首先,我们来看多对一(Many-to-One)的关联映射。这种映射关系通常...

    Hibernate+中文文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    hibernate3.2中文文档(chm格式)

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    Hibernate中文详细学习文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    HibernateAPI中文版.chm

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate3学习总结

    - **关联关系映射**:包括一对一、一对多、多对多关系,通过 `&lt;one-to-one&gt;`、`&lt;many-to-one&gt;`、`&lt;one-to-many&gt;` 和 `&lt;many-to-many&gt;` 标签进行配置。 - **继承关系映射**:支持单表继承、联合继承和表分片等策略...

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    hibernate中文参考文档

    - **多对一(Many-to-One)**: 使用`&lt;many-to-one&gt;`标签或`@ManyToOne`注解。 - **多对多(Many-to-Many)**: 使用`&lt;set&gt;`标签配合`inverse="true"`属性或`@ManyToMany`注解。 #### 八、高级特性 - **懒加载(Lazy ...

    hibernate经典教材从入门到精通(共四篇)

    此外,事务管理和并发控制也是重要的内容,如乐观锁和悲观锁的概念及其在Hibernate中的应用。 第四篇通常会涵盖一些实战和最佳实践,如性能优化技巧,如何减少数据库访问次数、提高查询效率,以及如何避免常见的...

    Hibernate多对多关联关系demo

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中...

    hibernateJar包及配置文件

    - 实体类与数据库表的映射:通过`&lt;class&gt;`标签定义实体类,`&lt;id&gt;`表示主键,`&lt;property&gt;`或`&lt;many-to-one&gt;`等标签用于映射字段。 - 注解映射:在实体类中使用Hibernate注解(如@Entity、@Table、@Id、@...

    hibernate3.2官方中文参考手册(pdf版)

    此外,还会讲解一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)的关系映射,以及集合映射(Set、List、Map等)。 查询语言是Hibernate的重要组成部分,手册会深入...

    hibernate3.6.7中文参考手册

    - **Mapping one-to-one and one-to-many associations**:定义一对一和一对多关联的映射规则。 - **自然 ID(natural-id)**:引入自然 ID 概念,增强实体类的唯一性和可识别性。 此文档不仅提供了 Hibernate 使用...

    Hibernate教程_note.pdf

    基本映射标签和属性的介绍包括了&lt;hibernate-mapping&gt;、、、、&lt;many-to-one&gt;、&lt;one-to-one&gt;等,这些都是在映射文件中定义对象和表关系的基本元素。例如,&lt;many-to-one&gt;标签用于描述多对一的关联映射,而&lt;one-to-one&gt;...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    Many-to-one:MDM8.0 MRP

    在IT行业中,"Many-to-one"通常指的是关系数据库设计中的一种关系模式,即一对多关系。在这种关系中,一个实体(比如数据库表)可以与另一个实体的多个实例相关联。例如,一个员工可以隶属于多个项目,但每个项目...

    最全Hibernate 参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    HIBERNATE官方参考手册

    5. **会话(Session)**:Hibernate的会话接口是数据库操作的主要入口,它是短暂的,用于管理数据库事务和缓存。 6. **事务(Transaction)**:Hibernate支持JTA(Java Transaction API)和JDBC事务,通过`Session`...

Global site tag (gtag.js) - Google Analytics