hibernate 六

一、复习
实体状态
transient 临时状态 only in memory , not associted with persistent manager , new Entity()
persistent 持久状态 both in memory(associted with persistent manager) and in database
detached 游离状态 both in memory(not associted with persistent manager) and in database

关联关系

J2EE分层
表现层,业务层,数据层

二、Hibernate控制的事务

ACID
atomicity consistency isolation durability

事务保证原子操作的不可分,也就是操作的同时成功或同时失败。
Transaction tran=session.beginTranaction();
tran.commit();
tran.rollback();
以上是事务对象的方法,来实现对事务的支持。

三、hibernate的事务隔离级别

hibernate的事务隔离级别和JDBC中大致相同。
设置时要在hibernate.cfg.xml配置
<property name="hibernate.connection.isolation">4</property>
1,读未提交的数据(Read uncommitted isolation)
2,读已提交的数据(Read committed isolation)
4,可重复读级别(Repeatable read isolation)
8,可串行化级别(Serializable isolation)

四、hibernate的锁(悲观锁,乐观锁)
session.get(User.class , userid , LockMode.UPGRADE);

悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。
LockMode.UPGRADE,修改锁,在get()方法中加上这个设置作为第三个参数。
LockMode.NONE 无锁机制
LockMode.READ 读取锁
LockMode.WRITE 写入锁,不能在程序中直接使用
还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁

乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题。

版本检查
要在其表中多加上一列表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号,并且只有版本号相同才会予以更新,如果版本号低,就会抛出例外。
<version name="version" column="version" type="integer" />

时间戳
使用时间戳,是通过最后修改时间来判断是否来做更新操作,也就是只有在最后更新时间之后才会做更新。
<timestamp name="updateTime" column="updatetime"/>

五、类继承关系映射

建表策略
(1)所有类建一个表 (2)只为具体类建表 (3)每个类建一个表。

只为具体类建表,使用于不使用多态的情况下,具体类之间没有继承关系时适用
需要针对每个类写映射配置文件,就和普通的单表映射的xml文件相同。
也可以使用一个xml文件来进行映射,可以通过写union-subclass标签来表现其关系
这里不能使用id生成策略中的native,而是要指定特定的生成策略。

例:

<union-subclass name="notpad" table="tpcc_notpad">
<property name="wight" column="wight" type="integer"/>
</union-subclass>
<union-subclass name="desktop" table="tpcc_desktop">
<property name="LCD" column="isLCD" type="yes_no"/>
</union-subclass>


每个类建一个表,可以有效减少数据的冗余,减少字段,查询效率不很高。
正对每个类建一个表,只要写一个配置文件来进行类的映射即可
映射文件中的子类可以使用join-subclass标签来表示,并且引用父类的主键作为共享主键,就是不需要指定id生成策略
例:

<hibernate-mapping package="alan.hbn.rel.inherit" auto-import="false">

<class name="Computer" table="tph_computer">

<id name="comid" column="comid" type="long" unsaved-value="0">
<generator class="identity"/>
</id>
<property name="price" column="price" type="integer"/>
<joined-subclass name="notpad" table="tpc_notpad">
<key column="comid" />
<property name="wight" column="wight" type="integer"/>
</joined-subclass>

<joined-subclass name="Guest" table="tpc_guest">
<key column="comid" />
<property name="LCD" column="isLCD" type="yes_no"/>
</joined-subclass>
</class>

</hibernate-mapping>


所有类只建一个表,查寻效率比较高,但是会产生很多空间浪费,当子类中的非空约束,就不大适用了,这是对于子类可以使用subclass标签表示。

<hibernate-mapping package="alan.hbn.rel.inherit" auto-import="false">

<class name="Computer" table="tph_computer">

<id name="id" column="id" type="long" unsaved-value="0">
<generator class="identity"/>
</id>

<discriminator column="computer_type" type="integer"/>

<property name="price" column="price" type="integer"/>

<subclass name="Administrator" discriminator-value="ad">
<property name="wight" column="wight" type="integer"/>
</subclass>

<subclass name="Guest" discriminator-value="gu">
<property name="LCD" column="isLCD" type="yes_no"/>
</subclass>
</class>

</hibernate-mapping>

不考虑多态时,最好是用只针对具体类建表(2个表),而考虑多态时尽量使用所有类建一个表,只有当子类中的属性过多是才考虑每个类建一个表的策略。
### 关于 Hibernate 6 的演示示例或入门教程 以下是有关 Hibernate 6 的一些关键概念以及如何构建一个简单的入门项目: #### 1. **Hibernate 6 特性概述** Hibernate 是一种流行的 ORM(对象关系映射)框架,用于简化 Java 应用程序中的数据库操作。Hibernate 6 增加了许多新特性和支持,例如改进的 JPA 支持、增强的查询功能和更好的性能优化[^4]。 #### 2. **环境搭建** 为了创建一个基于 Hibernate 6 的简单应用程序,需要完成以下配置: - 添加 Maven 或 Gradle 依赖项来引入 Hibernate 和其他必要的库。 - 配置 `persistence.xml` 文件或者通过 Java 类定义实体管理器工厂。 ##### Maven 依赖项 ```xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.0.0.Final</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` #### 3. **基本代码实现** 下面是一个完整的例子,展示如何使用 Hibernate 6 创建并保存数据到 H2 数据库中。 ##### 实体类 ```java import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; public User() {} public User(String username, String email) { this.username = username; this.email = email; } // Getters and Setters... } ``` ##### 主方法 ```java import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class MainApp { public static void main(String[] args) { try (Session session = new Configuration() .configure("hibernate.cfg.xml") // 加载配置文件 .addAnnotatedClass(User.class) .buildSessionFactory().openSession()) { Transaction transaction = session.beginTransaction(); // 创建一个新的用户实例 User user = new User("JohnDoe", "john.doe@example.com"); // 将其持久化至数据库 session.save(user); transaction.commit(); } } } ``` ##### Hibernate 配置文件 (`hibernate.cfg.xml`) ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">org.h2.Driver</property> <property name="connection.url">jdbc:h2:mem:testdb</property> <property name="connection.username">sa</property> <property name="connection.password"></property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.H2Dialect</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create-drop</property> </session-factory> </hibernate-configuration> ``` 此代码展示了如何设置 Hibernate 并将其连接到内存型 H2 数据库上运行。它还说明了如何将新的记录插入表中。 #### 4. **集成 Spring Boot** 如果希望进一步扩展应用规模,则可以考虑将 Hibernate 整合进 Spring Boot 中。这可以通过添加相应的 Starter 依赖项轻松实现,并利用自动配置机制减少手动编码的工作量[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值