`

Hibernate映射数据库表的两种方式

阅读更多

实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的。Hibernate支持xml配置文件与@注解配置两种方式。xml配置文件是最基础的配置@注解是Java的官方JPAJava Persistence API提供的。本章分别使用@注解与xml讲解Hibernate的映射配置。

10.1  实体类的映射

Java的角度讲,实体类就是普通的Java封装类(有人称为POJO有人称为VO)。仅从实体类中的代码信息,Hibernate并不能得知该实体类对应哪个数据表,因此还需要以某种方式配置一下。常用的方式有*.hbm.xml文件配置与@注解配置两种。

hbm.xml文件就是普通的xml文件,hbmHibernate Mapping的缩写,这样从文件名上就能判断该文件为Hibernate实体类配置文件。在JPA出现之前,Hibernate都使用hbm.xml文件配置。JPA出现后,推荐使用JPA@注解配置,因为对于所有的ORM框架,@注解都是通用的。

10.1.1  使用@注解配置实体类

实体类一般有ID、普通属性、集合属性等,分别对应数据库的主键、普通列、外键。@注解配置中,实体类用@Entity注解,用@Table指定对应的数据表,用@Id配置主键,用@Column配置普通属性,用@OneToMany@ManyToOne@OneToOne@ManyToMany配置实体间关系等。实体类之间的关于在后面的章节中会做详细介绍。下面编写一个UsersVo类,在该类中使用@注解配置实体类的映射,UsersVo类的代码如下:

package com.cn.vo;

import javax.persistence.*;

@Entity // 注解Entity表示该类纳入Hibernate管理,能够被持久化

@Table(name = "users") // 指定该实体类对应的数据库表名

public class UsersVo {

//  Fields

@Id // 指定该列为主键。

 // 这个注解用来表示主键类型, auto为数据库自增长类型

@GeneratedValue(strategy = GenerationType.AUTO)

private int id;

 

@Column(name = "name") //指定变量对应的数据库表的列为"name"

private String name;

 

@Column(name = "age")//指定变量对应的数据库表的列为"age"

private int age;

 

@Column(name = "tel")//指定变量对应的数据库表的列为"tel"

private String tel;

 

@Column(name = "address")//指定变量对应的数据库表的列为"address"

private String address;

 

// Constructors

 

public UsersVo() {

}

 

public UsersVo(int id) {

this.id = id;

}

 

public UsersVo(int id, String name, int age, String tel,

String address) {

this.id = id;

this.name = name;

this.age = age;

this.tel = tel;

this.address = address;

}

 

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}

上述代码中,所有的@注解都是javax.persistence.*下的,而不是org.hibernate.*下的。javax.persistence.*下的注解为JPA规范规定的注解,用于标注实体类与数据库的映射关系,而org.hibernate.*下的注解仅用于补充,当某个功能JPA暂时不支持而Hibernate支持时使用。

10.1.2  使用XML文件配置实体类映射

多个实体类可以配置在一个XML文件中。Hibernate推荐XML映射文件和实体类同名,便于阅读和维护,比如UsersVo.java文件对应UsersVo. hbm.xml文件。XML文件一般以“.hbm.xml”结尾,便于辨认,也可以直接用“.xml”结尾。例如UsersVo类的映射文件可取名为“UsersVo.hbm.xml”或者“UsersVo.xml”。使用XML文件配置实体类映射的时候,实体类和普通的实体类一样,和数据库的映射关系放在XML文件中,UsersVo. hbm.xml文件代码如下:

 <?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

<!--  name=””用来指定实体类, table="”用来指定数据库表格 catalog表示连接的数据库 lazy表示延迟加载 -->

    <class name="com.cn.vo.UsersVo" table="users" catalog="bank" lazy="false">

        <id name="id" type="java.lang.Integer"><!--  配置实体类变量-->

            <column name="id" /><!--  主键的字段名  -->

            <generator class="assigned" /><!-- 主键 类型,这里设置成不主动增长 -->

        </id>

        <property name="name" type="java.lang.String"><!--  配置实体类变量-->

            <column name="name" length="20" /><!--  数据库的字段名和字段长度  -->

        </property>

        <property name="age" type="java.lang.Integer"><!--  配置实体类变量  -->

            <column name="age" length="3" /><!--  数据库的字段名和字段长度  -->

        </property>

        <property name="tel" type="java.lang.String"><!--  配置实体类变量  -->

            <column name="tel" length="20" /><!--  数据库的字段名和字段长度  -->

        </property>

        <property name="address" type="java.lang.String"><!--  配置实体类变量  -->

            <column name="address" length="50" /><!--  数据库的字段名和字段长度  -->

        </property>

    </class>

</hibernate-mapping>

代码中的DOCTYPE指定的dtd文件位于hibernate.jar中。dtd文件为XML格式验证文件,Hibernate使用该dtd来验证该XML文件格式是否正确。如果hibernate.jar或者classpath中不存在该dtd文件,Hibernate会到指定的URL下载该文件。

在上述的映射文件中,<class>中的name表示实体类的路径和名称。table="”用来指定数据库表格 catalog表示连接的数据库 lazy表示延迟加载,<id>用来声明表的主键,<id>中的属性name="id"表示实体类的属性id。数据库对应的字段名放在<column>中,<column>中的name表示表中的字段名,<generator class="assigned" />表示数据库表的主键类型为默认的类型,默认的类型是不自动增长类型,在<property>中映射表中的其他字段,<property>中的name属性值表示实体类的属性,type表示实体类属性的类型。表字段的映射放在<column>中,name的值是字段名,length表示字段长度。

10.1.3  hibernate.cfg.xml文件中配置实体类映射

实体类还需要配置到hibernate.cfg.xml中,以便Hibernate初始化实体类与数据库表的映射关系。如果只配置了映射关系,而没有配置到hibernate.cfg.xml中,Hibernate是无法解析实体类的,因为Hibernate无法自行判断哪些是实体类。

如果实体类是使用@注解配置的,需要用<mapping class=””/>配置,而如果是用XML文件配置的,需要用<mapping resource=””/>配置XML配置文件。hibernate.cfg.xml文件中配置实体类映射的示例代码如下:

<!-- 使用XML映射文件映射实体类的配置 -->

<mapping resource="com/cn/vo/UsersVo.hbm.xml"/>

<mapping resource="com/cn/vo/DeptVo.hbm.xml"/>

<!-- 使用@注解映射实体类的配置 -->

<mapping class="com.cn.vo.UsersVo "/>

<mapping class="com.cn.vo.DeptVo "/>

10.1.4  配置主键映射

实体类最好有主键列,并有对应的gettersetter方法,这是Hibernate推荐的。主键尽量使用可以为null值的类型,例如IntegerLongString等,而不要使用intlong等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而intlong等原始类型则不具备该功能。

1.  使用@注解配置主键

Hibernate中用@Id声明该列为主键列,同时用@Column声明该列的列名。当列名与属性名相同时,@Column配置可省略。@GeneratedValue用于指定主键的生成策略。Hibernate支持多种逐渐生成规则,例如自增长、由某个表决定、由Sequence决定等等。如果不配置@GeneratedValue,则必须手动设置ID值。

@Id

@Column(name = "id")

// 设置主键类型, auto表示主键是自增长类型

@GeneratedValue(strategy = GenerationType.AUTO) 

private Integer id;

2.  XML文件中配置主键

如果使用XML配置,主键用<id />配置,name指定实体类的主键属性,column指定数据表中的主键列名。使用嵌套的<generator />配置主键生成策略,native表示使用数据库自己的策略,在MySQL就是自增长类型,如果不用自动增长类型,则可以用assigned,例如:

<id name="id" column="id">

<generator class="native" />

</id>

10.1.5  主键生成规则

10.1.4节中讲到了主键的配置,在配置主键过程中,配置了主键是否是自动生成的。@Id配置主键的同时,也要用@GeneratedValue配置主键生成规则。主键生成规则也成为主键生成策略,负责维护新实体的主键值。用的最多的策略是自增长策略。Hibernate还支持其他的多种主键生成规则。这些生成规则有些是数据库提供的,有些是Hibernate提供的。

1.  使用@注解配置主键生成规则

到目前为止,@注解只支持四种逐渐生成策略:GenerationType.AUTOGenerationType.TABLEGenerationType. SEQUENCEGenerationType. IDENTITY,意义分别为:

GenerationType.AUTO:自动方式,根据底层数据库自动选择。如果为MySQL等支持自增长类型的数据库,则为自增长类型(auto_increment)。

GenerationType.TABLE:使用指定的表来决定主键的取值,一般结合@TableGenerator使用,示例代码如下:

@Id

@TableGenerator(name = "tb_cat_gen", allocationSize = 1)

@GeneratedValue(strategy = GenerationType.TABLE, generator = "tb_cat_gen")

private Integer id;

GenerationType. SEQUENCE:使用Sequence来决定主键的取值,适合OracleDB2PostgreSQLSAP DB等支持Sequence的数据库,一般结合@ SequenceGenerator使用。注意某些数据库如Oracle等没有自增长类型,只能使用Sequence,示例代码如下:

@Id

@SequenceGenerator(name = "seq_cat", allocationSize = 25)

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_cat")

@Column(name = "id")

private Integer id;

GenerationType. IDENTITY支持DB2MySQLMS SQL ServerSybase HypersonicSQL数据库的identit类型主键。

2.  使用XML文件配置主键生成规则

XML配置中支持的主键生成规则,比使用@注解的配置的主键生成规则要多,XML配置中支持的主键生成规则有以下几种:

native:取决于数据库,相当于GenerationType.AUTO

identity:使用identity类型,相当于GenerationType. IDENTITY

sequence:使用sequence,相当于GenerationType. SEQUENCE。需要指定sequence的名称,示例代码如下:

<id name="id" type=" java.lang.Integer " column=" id">

    <generator class="sequence"> <!-- 使用sequence主键生成规则 -->

         <param name="sequence">id_sequence</param>

    </generator>

</id>

increment:自增长类型,由Hibernate而不是数据库维护,因此即使Oracle等不支持自增长类型的数据库也可以使用。

hilohi/low算法,使用指定的表给主键赋值,相当于GenerationType.TABLE。需要指定表名、列名等,实例代码如下:

<id name="id" type=" java.lang.Integer " column=" id">

   <generator class="hilo">

         <param name="table">users</param>

         <param name="column">id</param>

         <param name="max_lo">200</param>

   </generator>

</id>

seqhilo基于sequencehilo算法例如

<id name="id" type=" java.lang.Integer " column="id">

   <generator class="seqhilo">

        <param name="sequence">hi_value</param>

           <param name="max_lo">200</param>

    </generator>

</id>

uuid使用128位的UUID算法计算一个唯一的值会使用IP地址及相关的计算机硬件信息。计算结果为32位的16进制数,对应的主键类型必须为String

guid:使用MySQL或者MS SQL Server等数据库提供的GUID值。

assigned:默认值,不使用任何策略,在保存进数据库之前必须使用setter方法赋值。

select:使用数据库触发器赋值。

foreign:使用外键赋值,在一对一实体关系时,可保证关系双方的Id保持一致。

MySQL数据库与Hibernate都提供自增长策略,但是原理是不太一样的。如果采用MySQL的自增长,插入数据时Hibernate生成的SQL语句中将不包含id主键列数据。该主键的当前值、下一个值由数据库自己维护。如果使用Hibernate的自增长,插入数据时Hibernate生成的SQL语句将包含id主键列,并由Hibernate维护该主键的当前值以及下一个值。

对于普通的应用来说,数据库自增长与Hibernate自增长在使用上没有区别。但是如果某数据库同时被两个Hibernate程序使用,那么此时使用Hibernate自增长将会出现错误。例如如果当前主键值为101,那么Hibernate会认为下个主键值为102,两个Hibernate程序插入数据时都会将主键值设为101,这时会因为主键冲突而导致其中一个写数据失败。

10.1.6  使用@注解配置普通属性映射

这里说的普通属性,是指除了主键外的、Java基本类型的属性,Integer类型与int类型是不同的,Integer默认为null,在数据库中也表现为null,而int默认为0,在数据库中也表现为0

普通属性使用@Column@Basic配置。二者都可以省略。如果省略,则全部按照默认的规则配置,@Column@Basic的用法如下:

@Column中可指定nullable(是否允许为null)、unique(是否唯一)、insertable(是否允许插入)、updatable(是否允许更新)、length(列长度)、columnDefinition(列类型)、scale(整数长度)、precision(小数点精度)等。这些属性用于生成DDL建表语句。如果属性对应的列名与属性名一致,@Column可以省略。

@Basic可为普通属性配置加载方式,默认为即时加载。如果列数据比较大,例如大文本类型或者LOB类型,可配置为延迟加载。optional配置该列是否可为null。如果为true,表示该属性是可选的,可以为null,否则不可以为null

@Column@Basic使用的代码示例如下:

@Column(name = "usersName", nullable = true, columnDefinition = "varchar", insertable = true, length = 255, unique = true, updatable = true, precision = 2, scale = 4) 

@Basic(fetch = FetchType.LAZY, optional=true)

private String usersName;

日期属性也是普通的属性需要用@Basic声明加载方式、@Column等指定列名二者都可省略。另外,如果日期属性是java.util.Date类型的,必须要用@Temporal配置日期类型,取值可以为DateTime或者Timestemp。否则Hibernate将无法区分该类型是到底是java.sql.Date(只有年月日等日期信息)类型还是java.sql.Time(只有时分秒等时间信息)类型、还是java.sql.TimeStamp(既有日期信息、又有时间信息)类型。例如:

@Temporal(TemporalType.TIMESTAMP) // 日期类型为DATE, TIME或者TIMESTEMP

@Column(name = " birthday")

private java.util.Date birthday;

在配置日期属性时,如果属性类型是java.util.Date类型,需要用@Temporal声明日期类型。但是如果是java.sql.Timejava.sql.Date或者java.sql.TimeStamp类型的,类型本身就已经很明确了,不再需要@Temporal声明了。

10.1.7  使用XML文件配置普通属性映射

XML中使用<property />标签配置普通属性。type属性指定列类型,相当于@Column中的columnDefinition。例如,如果设置type=text”可以为String类型属性设置为大文本类型列。不同于@注解中的@Column,如果属性名与列名一致,column属性可省略,xml配置中的<property>必须配置,否则视为不参与持久化的列。配置为: 

<property name="salary" precision="2" scale="10" length="255"

column="salary" type="string" update="true" insert="true"

lazy="false" unique="false" not-null="false">

</property>

在使用@注解配置中,如果没有对普通属性进行配置,则默认该属性名与数据表列名相同;而xml文件配置中,如果对普通属性没有配置,则认为该属性没有对应的数据库列,不参与持久化。二者是截然不同的。

在配置日期类型属性时,type属性中指定日期类型,取值可以为datetimetimestamp等简写方式,也可以为java.sql.Datejava.sql.Timejava.sql.Timestamp等全写方式。

同样的道理,如果Java中属性类型为java.util.Date类型,必须指定是java.sql.Date(只有年月日等日期信息)类型还是java.sql.Time(只有时分秒等时间信息)类型、还是java.sql.TimeStamp(既有日期信息、又有时间信息)类型。示例代码如下:

<property name=" birthday" type="date"></property>

10.1.8  配置临时属性映射

实体类可能有一些临时属性,在JPA中被称为Transient属性。这些属性用于方便计算等其他用途,而不是保存数据到数据库中。这些属性必须被标记为Transient,以便Hibernate把它们区别对待。否则Hibernate会试图往数据库写该属性,可能会因对应的列不存在而抛出异常。

Java标注中,临时属性必须使用@Transient标注,既可以配置在临时属性上,也可以配置在对应的gettersetter方法上。例如:

@Transient

public int getCount() { // 临时属性,用于计算总记录数

return name == null ? 0 :count;

}

如果只有形如gettersetter的方法,但是没有对应的属性,Hibernate仍然会认为该属性存在。因此也需要用@Transient标注。 

而在XML配置中,所有没有配置到XML文件中的属性都被视为临时属性。如果某属性漏配置了,该属性值将不被保存到数据库中。

10.2  Hibernate中的悲观锁和乐观锁

悲观锁和乐观锁用于处理数据的并发访问。Hibernate中有一种特殊的属性:版本(Version)属性。版本属性不参与业务逻辑,只用来保证不会有两个线程同时对该数据进行写操作。版本属性是乐观锁的一种实现方式。乐观锁是相对于悲观锁而言的。悲观锁与乐观锁都是保证数据准确性的机制。

10.2.1  什么是悲观锁

悲观锁假定其他用户企图访问或者改变你 正在访问、更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。

为保证数据的准确性,程序必须保证在一个线程修改数据的时候,该数据没有被其他线程修改。在传统的数据库编程中,程序修改数据时先锁定该数据行,使其他程序无法修改该行数据,修改完毕后释放数据锁,以此保证数据准确性。由于该机制需要锁定数据行,被锁定的数据只能被一个线程使用,因此被称为悲观锁。

10.2.2  悲观锁的使用

Hibernate的悲观锁是使用SQL语句或者HQL语句实现的,下面是一个典型的倚赖数据库的悲观锁调用: 

select * from users where name=”Jack” for update

这条 sql 语句锁定了 users 表中所有符合检索条件(name=Jack”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。Hibernate 的悲观锁,也是基于数据库的锁机制实现。

下面的代码实现了对查询记录的加锁: 

String hql ="from Users where name='Jack';

Query query = session.createQuery(hql);

query.setLockMode("users",LockMode.UPGRADE); // users表进行加锁 

List list = query.list();// 执行查询,获取数据 

query.setLockMode 对查询语句中,特定数据库表的记录进行加锁(这里是users表),这里也就是对返回的所有 users记录进行加锁。

观察运行期 Hibernate 生成的 SQL 语句:

select users0_.id as id, users0_.name as name, users0_.group_id

as group_id, users0_.user_type as user_type, users0_.sex as sex

from users users0_  where users0_.name='Jack' ) for update

这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。

10.2.3  什么是乐观锁

与悲观锁相反,乐观锁使用完全不同的方式。乐观锁通过Version列保存当前数据的版本,如果程序修改了数据,就将版本列加1。反过来,如果版本列有了变化,说明该数据被修改过了。程序保存数据时会检查数据的Version列。如果Version列已经发生了变化,程序会重新读取、修改并保存数据。由于该机制不需要锁定数据行,允许多条线程同时访问同一条数据,因此被称为乐观锁。乐观锁的效率要高于悲观锁,因此现代编程更倾向于乐观锁。

乐观锁则认为其他用户企图改变正在更改的对象的概率是很小的,因此乐观锁直到准备提交所作的更改时才将对象锁住,读取以及改变该对象时并不加锁。可见乐观锁加锁的时间要比悲观锁短,乐观锁可以用较大的锁粒度获得较好的并发访问性能

10.2.4  乐观锁的配置

Hibernate支持乐观锁,保存数据时Hibernate会自动完成检查Version列、修改数据、更新Version列等工作。Hibernate隐藏了所有的Version操作细节,只需要指定实体类的Version列即可。实体类中可用@Version配置版本属性。版本列一般为数字类型属性。例如:

@Version

private int version;

XML中使用<version />配置乐观锁,name属性配置版本列。注意<version/>版本列要配置在<id/>主键后面、<property/>普通属性前面。例如:

<version name="version"></version>

XML配置版本属性要比@配置灵活,版本属性既可以为intlong等数据类型,也可以为Timestamp时间戳等类型,配置时用type

分享到:
评论

相关推荐

    hibernate实现数据库表的多种关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。本示例着重于如何利用Hibernate来实现不同类型的数据库表之间的关联,包括一对一、一对多、多对一...

    JAVA数据类型与Hibernate的类型映射

    在Java编程语言中,数据类型分为两种:基本数据类型(如int、char)和引用数据类型(如类、接口、数组)。而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据...

    Hibernate映射关系配置:XML方式和注解方式

    `hibernate实体映射关系.doc`可能包含了详细讲解Hibernate实体映射关系的文档,涵盖XML和注解两种方式的具体配置,包括但不限于: - 实体类的创建与映射 - 主键生成策略的配置 - 不同关联关系(一对一、一对多、多...

    hibernate 无主键表映射

    在Java的持久化框架Hibernate中,无主键表映射是一种特殊情况,主要处理那些在数据库中没有明确单一主键的表。这种情况通常出现在那些通过多个字段共同唯一标识一条记录的复合主键(Composite Key)场景。本文将详细...

    让Hibernate同时支持xml和注解两种映射方式

    Spring提供了`LocalSessionFactoryBean`用于配置基于XML的Hibernate映射,而`AnnotationSessionFactoryBean`则用于处理基于注解的映射。这两个类分别处理不同的映射方式,所以默认情况下,它们不能直接共存于同一个...

    hibernate数据库映射例子.zip

    Hibernate提供了编程式和声明式两种事务管理方式,确保数据的一致性和完整性。 通过分析这些示例,初学者可以深入理解Hibernate的映射机制,学习如何创建和管理对象关系,以及如何利用Hibernate进行高效的数据操作...

    hibernate映射枚举类型

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...

    Hibernate映射实例

    确保数据库与Hibernate映射文件一致,能正确地反映实体之间的关系。导入DBO到SQL Server数据库后,就可以通过Hibernate的Session接口进行CRUD(创建、读取、更新、删除)操作了。 在开发过程中,理解并熟练运用这些...

    Hibernate映射树形结构

    本篇文章将深入探讨如何在Hibernate中映射树形结构,这是一种处理复杂数据结构的有效方式。 首先,树形结构在数据库中通常表示为层级数据,例如组织结构、目录树或类别层次。在Hibernate中,映射这种结构的关键在于...

    Hibernate高级映射实例

    在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,通过XML配置文件或注解,我们可以定义对象与表之间的关系,以便于对象的CRUD(创建、读取、更新、删除)操作对应到数据库的SQL操作。 1. **单向一对一映射...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    总之,单一表继承策略是一种简单且直观的Hibernate继承映射方式,适合类继承层次结构不深且子类数量较少的情况。但在大型项目或复杂的类继承结构中,可能需要考虑其他策略,如`JOINED`或`TABLE_PER_CLASS`。理解并...

    hibernate配置数据库连接池的三种方法

    Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式来操作数据库。在Hibernate中配置数据库连接池,可以使数据库操作更加高效和便捷。这里有两种常见的配置方法: 1. **C3P0**: ...

    hibernate one to one 映射到两种方式

    本篇文章将详细探讨Hibernate中实现一对一映射的两种方式,并结合源码分析其原理。 一、主键外键关联(Primary Key Join) 这是最常用的一对一映射方式,通过共享主键来实现两个实体之间的关联。这种方式下,一个...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    Hibernate提供了懒加载和立即加载两种策略。默认情况下,一对多关系使用懒加载,只在实际需要时加载关联数据;而一对一和多对一关系默认为立即加载,即加载父对象时会同时加载子对象。这可以通过调整`fetch`属性来...

    用Hibernate映射继承关系

    本主题聚焦于“用Hibernate映射继承关系”,我们将深入探讨Hibernate如何处理对象的继承层次结构,并将其映射到数据库中的表。 Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    其次,XML映射数据库是ORM(Object-Relational Mapping)的一种实现,目的是将XML配置文件中的数据结构与数据库表结构对应起来,常见的框架有Hibernate和MyBatis。在本程序集中,可能是使用XML配置文件定义了数据库...

Global site tag (gtag.js) - Google Analytics