
不想说什么,都是多余的.
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) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...
在本篇文章中,我们将深入探讨Hibernate中的几种关联映射,包括多对一(Many-to-One)、一对一(One-to-One)以及一对多(One-to-Many)映射。 首先,我们来看多对一(Many-to-One)的关联映射。这种映射关系通常...
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 ...
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) ...
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 ...
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) ...
- **关联关系映射**:包括一对一、一对多、多对多关系,通过 `<one-to-one>`、`<many-to-one>`、`<one-to-many>` 和 `<many-to-many>` 标签进行配置。 - **继承关系映射**:支持单表继承、联合继承和表分片等策略...
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. 在...
- **多对一(Many-to-One)**: 使用`<many-to-one>`标签或`@ManyToOne`注解。 - **多对多(Many-to-Many)**: 使用`<set>`标签配合`inverse="true"`属性或`@ManyToMany`注解。 #### 八、高级特性 - **懒加载(Lazy ...
此外,事务管理和并发控制也是重要的内容,如乐观锁和悲观锁的概念及其在Hibernate中的应用。 第四篇通常会涵盖一些实战和最佳实践,如性能优化技巧,如何减少数据库访问次数、提高查询效率,以及如何避免常见的...
在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中...
- 实体类与数据库表的映射:通过`<class>`标签定义实体类,`<id>`表示主键,`<property>`或`<many-to-one>`等标签用于映射字段。 - 注解映射:在实体类中使用Hibernate注解(如@Entity、@Table、@Id、@...
此外,还会讲解一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)的关系映射,以及集合映射(Set、List、Map等)。 查询语言是Hibernate的重要组成部分,手册会深入...
- **Mapping one-to-one and one-to-many associations**:定义一对一和一对多关联的映射规则。 - **自然 ID(natural-id)**:引入自然 ID 概念,增强实体类的唯一性和可识别性。 此文档不仅提供了 Hibernate 使用...
基本映射标签和属性的介绍包括了<hibernate-mapping>、、、、<many-to-one>、<one-to-one>等,这些都是在映射文件中定义对象和表关系的基本元素。例如,<many-to-one>标签用于描述多对一的关联映射,而<one-to-one>...
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) ...
在IT行业中,"Many-to-one"通常指的是关系数据库设计中的一种关系模式,即一对多关系。在这种关系中,一个实体(比如数据库表)可以与另一个实体的多个实例相关联。例如,一个员工可以隶属于多个项目,但每个项目...
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. 在集合中出现的依赖对象 ...
5. **会话(Session)**:Hibernate的会话接口是数据库操作的主要入口,它是短暂的,用于管理数据库事务和缓存。 6. **事务(Transaction)**:Hibernate支持JTA(Java Transaction API)和JDBC事务,通过`Session`...