`
anxin587
  • 浏览: 24006 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate初级 映射对象标识符

阅读更多

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,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...

    Spring+Hibernate 自动映射

    标题中的“Spring+Hibernate 自动映射”是指在Java Web开发中,利用Spring框架与Hibernate ORM工具进行数据层的整合,实现对象关系映射(ORM)的自动化处理。这一技术结合了Spring的强大依赖注入(DI)和事务管理...

    Hibernate对象关系映射

    Hibernate对象关系映射一对多 很基础等文档

    hibernate关联映射实例

    在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...

    [原]Hibernate集合映射

    总之,Hibernate集合映射是对象关系映射的重要组成部分,理解并熟练掌握各种映射类型、级联操作、缓存策略等,将有助于我们在实际开发中更高效、更灵活地处理数据库与Java对象之间的关系。在实践中,不断调整和优化...

    Hibernate 注解映射

    在实体类中,可以使用 JPA 的标准注解来描述对象关系映射。这些注解可以添加在属性上,也可以添加在 getXxx() 方法之上。 * @Entity:映射一个实体类,指定关联的表名。 * @Id:映射 OID,指定主键。 * @...

    Hibernate容器映射技术(Set、List、Map)

    Hibernate容器映射技术(Set、List、Map)

    Hibernate 实体映射实例

    注:为节省空间,程序中需要的jar包,均在HibernateManytoManyMapCascadingSave.zip\HibernateManytoManyMapCascadingSave\lib\ &lt;br&gt;Hibernate 多对多实体映射实例 &lt;br&gt;学习Hibernate 实体映射的映射的好帮手...

    hibernate映射和查询

    在 Hibernate 中,对象关系映射(ORM)是将数据库表映射到 Java 类的过程。这个过程通过 `hibernate.cfg.xml` 配置文件和实体类(Entity Class)来实现。在 `hibernate.cfg.xml` 文件中,我们配置数据库连接参数,如...

    Hibernate实体映射

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本资源“Hibernate实体映射”提供了一个深入理解这一关键概念的机会,通过...

    hibernate array 数组映射

    在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...

    Hibernate查询映射试验

    首先,Hibernate的核心是对象关系映射(ORM),它允许我们将Java对象与数据库表进行映射,这样我们就可以用面向对象的方式来处理数据。在Hibernate中,这种映射通常通过XML配置文件(hibernate.cfg.xml)和实体类...

    自动生成hibernate映射文件和实体类

    1. Hibernate 是一种开源的持久层框架,提供了一个高效的数据访问机制,能够将 Java 对象与数据库表进行映射。 2. MyEclipse 是一个集成开发环境(IDE),提供了丰富的开发工具和插件,包括数据库管理、代码编辑、...

    用Hibernate映射继承关系

    映射继承关系是Hibernate中一项高级特性,它允许你将面向对象的设计模式映射到关系型数据库中。选择正确的映射策略取决于许多因素,包括性能需求、数据一致性和应用程序架构。通过了解这些不同的映射策略,你可以更...

    Hibernate 映射文件自动生成

    在Java开发中,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作。Hibernate通过XML或注解方式将Java类与数据库表进行映射,使得开发者可以使用面向对象的方式来处理数据库。然而,手动...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    Hibernate内置标识符生成器

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者用 Java 对象的方式来操作数据库。在 Hibernate 中,对象的唯一标识符(OID)是非常重要的,因为它用来区分数据库中的不同记录。OID通常被称为主键...

    精通Hibernate:Java对象持久化详解.zip

    Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了Java应用中的数据库操作,使得开发者能够更专注于业务逻辑而不是繁琐的SQL代码。 在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质...

    hibernate组件映射

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java应用与数据库之间的交互。在Hibernate中,组件映射是将一个类的实例作为另一个类的一个属性进行持久...

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

    此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...

Global site tag (gtag.js) - Google Analytics