Hibernate使用对象标识符来建立内存中的对象和数据库表中记录的对应关系,我们多知道关系数据库用主键来标识并记录每条记录的唯一性,我们把具有业务含义的字段作为主键称为自然主键,而不具备业务含义的字段称为代理主键,比较两变量所引用的内存地址是否相等用==,equals是按照内存地址来比较的。
Hibernate用对象标识符来区分对象,
public static void testEquals()
{
Session session=HibernateUtil.getSessionFactory().openSession();
Customer c1=(Customer)session.load(Customer.class,new Long(1));
Customer c2=(Customer)session.load(Customer.class,new Long(1));
Customer c3=(Customer)session.load(Customer.class,new Long(2));
System.out.println(c1==c2);
System.out.println(c1==c3);
session.getTransaction().commit();
}上面的方法中c1==c2 输出true,第2个输出false,第一个自因为会是true,是因为第一次加载OID为1的Customer对象再数据库表中查处id为1 的记录,从而创建Customer的实例,并且把他保存到了Session缓存中,最后赋给c1,这样当第2次load OID为1的对象的时候直接从缓存中取得Customer对象把引用赋给c2,所以c1==c2。
Hibernate允许在持久化类把OID定义为short (Short)2字节,int(Integer)4字节,long(Long)8字节,在对象关系映射中<id></id>元素用来设置对象标识符
<id column="ID" type="long" name="id"></id>
<generator class="increment"></generator><!---->
increment 标识符生成器有Hibernate以递增方式为代理主键赋值,hibernate在初始化阶段读取表中的最大主键值,由此可见increment标识符生成器仅仅在只有单个hibernate应用进程访问数据库的情况下才能有效工作,即使在同一个进程中创建了链接同一个数据库的多个SessionFactory实例,也会导致插入duplicate,但是他不依赖底层数据库系统,因此他适合与所有数据库系统,在集群环境下不推荐使用,Oid必须为long int short
identity由底层数据库来负责生成标识符,他要求把底层主键定义为自动增长字段类型,所以他要求底层数据库必须支持自动增加字段类型,
sequence标识符生成器利用底层数据库提供的序列来生成标识符,要求底层数据库支持序列
hilo 由Hibernate按照一种high/low算法来生成标识符
<id column="ID" type="long" name="id"></id>
<generator class="hilo"></generator>
hi_value
next_value
100
create table Hilo_TESTER( ID BIGINT NOT NULL, NAME VARCHAR(15),PRIMARY KEY (ID));
CREATE TABLE HI_VALUE(NEXT_VALUE INTEGER);
native 标识符生成器,依据底层数据库对自动生成标识符的支持能力来选择identity,sequence或者hilo标识符
映射自然主键
<id column="NAME" type="string" name="name"></id>
<generator class="assigned"></generator>
<version column="VERSION" name="version" unsaved-value="0"></version>
这样由应用程序为name属性赋值,不管对象是游离的还是持久的,name属性不会为null通过设置version属性的unsaved-value属性来判断,如果version属性为0表示临时对象,否则为游离对象,
映射复合自然主键有两种方式,下面将分别介绍
例子如下
CREATE TABLE HIB5_2
(
ID2 INT,
NAME VARCHAR(20),
AGE INT,
PRIMARY KEY(ID2,NAME)
)
这张表具有复合主键,映射方式一
package entity;
public class Hib5_2 implements java.io.Serializable
{
private Long id2;
private String name;
private int age;
public void setId2(Long id2)
{
this.id2=id2;
}
public Long getId2()
{
return this.id2;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return this.age;
}
}
上面是java文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Hib5_2" table="HIB5_2">
<composite-id>
<key-property name="id2" type="long" column="ID2"/>
<key-property name="name" type="string" column="NAME"/>
</composite-id>
<!--<version name="version" column="VERSION" unsaved-value="null"/>-->
<property name="age" type="int" column="AGE"/>
</class>
</hibernate-mapping>
映射文件如上所示
public static void testHib5_2()
{
/*
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Hib5_2 hib=new Hib5_2();
hib.setId2(new Long(1));
hib.setName("andy");
hib.setAge(24);
session.save(hib);
session.getTransaction().commit();
//*/
}
test方法如上面,这样就把数据保存到数据库中
第2中方式是定义单独的主键类
package entity;
import java.io.Serializable;
// define a sigle key class
public class Hib_id implements Serializable
{
private Long id2;
private String name;
public Hib_id(Long id2,String name)
{
this.id2=id2;
this.name=name;
}
public void setId2(Long id2)
{
this.id2=id2;
}
public Long getId2()
{
return this.id2;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
}
如上面所示,这个是单独的主键类
package entity;
public class Hib5_2 implements java.io.Serializable
{
private Hib_id id;
private int age;
public void setId(Hib_id id)
{
this.id=id;
}
public Hib_id getId()
{
return this.id;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return this.age;
}
}
映射类如上面所示
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Hib5_2" table="HIB5_2">
<!--
<composite-id>
<key-property name="id2" type="long" column="ID2"/>
<key-property name="name" type="string" column="NAME"/>
</composite-id>
-->
<composite-id name="id" class="Hib_id">
<key-property name="id2" type="long" column="ID2"/>
<key-property name="name" type="string" column="NAME"/>
</composite-id>
<!--<version name="version" column="VERSION" unsaved-value="null"/>-->
<property name="age" type="int" column="AGE"/>
</class>
</hibernate-mapping>
映射文件如上所示
public static void testHib5()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Hib_id hi=new Hib_id(new Long(2),"andy2");
Hib5_2 hib2=new Hib5_2();
hib2.setId(hi);
hib2.setAge(24);
session.save(hib2);
session.getTransaction().commit();
}
上面是Test方法,其实两者是差不多,后者多了一个主键类,然后映射文件那边composite-id 加上了name和class,操作的时候有些变动。呵呵。
分享到:
相关推荐
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...
标题中的“Spring+Hibernate 自动映射”是指在Java Web开发中,利用Spring框架与Hibernate ORM工具进行数据层的整合,实现对象关系映射(ORM)的自动化处理。这一技术结合了Spring的强大依赖注入(DI)和事务管理...
Hibernate对象关系映射一对多 很基础等文档
在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...
总之,Hibernate集合映射是对象关系映射的重要组成部分,理解并熟练掌握各种映射类型、级联操作、缓存策略等,将有助于我们在实际开发中更高效、更灵活地处理数据库与Java对象之间的关系。在实践中,不断调整和优化...
在实体类中,可以使用 JPA 的标准注解来描述对象关系映射。这些注解可以添加在属性上,也可以添加在 getXxx() 方法之上。 * @Entity:映射一个实体类,指定关联的表名。 * @Id:映射 OID,指定主键。 * @...
Hibernate容器映射技术(Set、List、Map)
注:为节省空间,程序中需要的jar包,均在HibernateManytoManyMapCascadingSave.zip\HibernateManytoManyMapCascadingSave\lib\ <br>Hibernate 多对多实体映射实例 <br>学习Hibernate 实体映射的映射的好帮手...
在 Hibernate 中,对象关系映射(ORM)是将数据库表映射到 Java 类的过程。这个过程通过 `hibernate.cfg.xml` 配置文件和实体类(Entity Class)来实现。在 `hibernate.cfg.xml` 文件中,我们配置数据库连接参数,如...
在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本资源“Hibernate实体映射”提供了一个深入理解这一关键概念的机会,通过...
在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...
首先,Hibernate的核心是对象关系映射(ORM),它允许我们将Java对象与数据库表进行映射,这样我们就可以用面向对象的方式来处理数据。在Hibernate中,这种映射通常通过XML配置文件(hibernate.cfg.xml)和实体类...
1. Hibernate 是一种开源的持久层框架,提供了一个高效的数据访问机制,能够将 Java 对象与数据库表进行映射。 2. MyEclipse 是一个集成开发环境(IDE),提供了丰富的开发工具和插件,包括数据库管理、代码编辑、...
映射继承关系是Hibernate中一项高级特性,它允许你将面向对象的设计模式映射到关系型数据库中。选择正确的映射策略取决于许多因素,包括性能需求、数据一致性和应用程序架构。通过了解这些不同的映射策略,你可以更...
在Java开发中,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作。Hibernate通过XML或注解方式将Java类与数据库表进行映射,使得开发者可以使用面向对象的方式来处理数据库。然而,手动...
6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法 6.4.1 increment标识符生成器 6.4.2 identity标识符生成器 6.4.3 sequence标识符生成器 6.4.4 hilo标识符生成器 ...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者用 Java 对象的方式来操作数据库。在 Hibernate 中,对象的唯一标识符(OID)是非常重要的,因为它用来区分数据库中的不同记录。OID通常被称为主键...
Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java应用与数据库之间的交互。在Hibernate中,组件映射是将一个类的实例作为另一个类的一个属性进行持久...
此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...