`

映射对象标识符(OID)

阅读更多
1. Hibernate用对象标识符(OID)来区分对象

      session缓存            student表
s1    student对象 OID=1      1    stu1
s2    student对象 OID=2      2    stu2
s3    student对象 OID=1


Student.java

package com.andrew.model;
public class Student {
    private long id;
    private String name;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }
}

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.andrew.model">
    <class name="Student" table="t_student">
        <id column="stuId" name="id">
            <generator class="native"/>
        </id>
        <property generated="never" lazy="false" name="name"/>
    </class>
</hibernate-mapping>

hibernate.cfg.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>
        <!-- 数据库连接设置 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- 方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 控制台显示SQL -->
        <property name="show_sql">true</property>
        <!-- 自动更新表结构 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- Mapper -->
        <mapping resource="com/andrew/model/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

HibernateUtil.java

package com.andrew.util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static SessionFactory buildSessionFactory() {
        // 1. 实例化配置文件
        Configuration configuration = new Configuration().configure();
        // 2. 实例化服务登记
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();
        // 3. 获取Session工厂
        return configuration.buildSessionFactory(serviceRegistry);
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

StudentTest.java

package com.andrew.service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.andrew.model.Student;
import com.andrew.util.HibernateUtil;
public class StudentTest {
    public static void main(String[] args) {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession(); // 1. 生成一个session
        session.beginTransaction(); // 2. 开启事务
        Student s1 = (Student)session.get(Student.class, Long.valueOf(1));
        Student s2 = (Student)session.get(Student.class, Long.valueOf(2));
        Student s3 = (Student)session.get(Student.class, Long.valueOf(1));
        System.out.println(s1==s2);
        System.out.println(s1==s3);
        session.getTransaction().commit(); // 3. 提交事务
        session.close(); // 4. 关闭session
    }
}

运行结果:
false
true


2. Hibernate对象标识符生成策略

主键的分类 业务主键 VS 代理主键 代理主键是不具有业务性的;

StudentIdTest.java

package com.andrew.service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.andrew.model.Student;
import com.andrew.util.HibernateUtil;
public class StudentIdTest {
    public static void main(String[] args) {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession(); // 1. 生成一个session
        session.beginTransaction(); // 2. 开启事务
        Student s = new Student();
        s.setName("张三");
        session.save(s);
        session.getTransaction().commit(); // 3. 提交事务
        session.close(); // 4. 关闭session
    }
}


1) increment由Hibernate自动以递增的方式生成标识符,适用代理主键

Student.hbm.xml

<generator class="increment"/>

StudentIdTest.java运行结果:
Hibernate: select max(stuId) from t_student
Hibernate: insert into t_student (name, stuId) values (?, ?)


2) identity由底层数据库生成标识符;适用代理主键

Student.hbm.xml

<generator class="identity"/>

StudentIdTest.java运行结果:
Hibernate: insert into t_student (name) values (?)


3) sequcence由Hibernate根据底层数据库的序列来生成标识符;适用代理主键

4) hilo由Hibernate根据high/low算法来生成标识符。适用代理主键

Student.hbm.xml

<generator class="hilo"/>

StudentIdTest.java运行结果:
Hibernate: select next_hi from hibernate_unique_key for update
Hibernate: update hibernate_unique_key set next_hi = ? where next_hi = ?
Hibernate: insert into t_student (name, stuId) values (?, ?)


5) native根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence或hilo;适用代理主键

Student.hbm.xml

<generator class="native"/>

StudentIdTest.java运行结果:
Hibernate: insert into t_student (name) values (?)
分享到:
评论

相关推荐

    对象到数据库的映射

    对象标识符(OID)通常是系统自动生成的唯一标识,用于区分不同的对象实例,不应包含任何业务含义,以免影响数据模型的独立性。 3.2 OID 的唯一性 每个对象实例都应该有一个唯一的OID,以确保在数据库中能够精确地...

    Hibernate内置标识符生成器

    在 Hibernate 中,对象的唯一标识符(OID)是非常重要的,因为它用来区分数据库中的不同记录。OID通常被称为主键(Primary Key)。Hibernate 提供了多种内置的标识符生成策略,以适应不同的数据库系统和应用场景。 ...

    对象-关系数据库之间的映射.pdf

    #### 对象标识符(OID) OID在对象持久化过程中扮演关键角色,但不应具有商业意义,即其值不能透露业务逻辑或状态。OID的唯一性由不同的策略保证,如使用整数序列、GUID/UUID、或通过特定机制自动分配。选择合适的...

    java一级缓存及对象关系映射

    在Hibernate中,通过OID来判断两个持久化对象是否相同,确保一级缓存中不会有重复的OID对象。在处理对象关系映射时,OID起到了关键的作用,使得对象在内存中的状态能够与数据库中的记录保持一致。 Hibernate的对象...

    Java实现SNMP获得OId值

    **OID(对象标识符)**是SNMP中的关键概念之一,它是一个由数字组成的层次结构,用作唯一标识网络管理信息库(MIB)中特定变量的地址。OID类似于URL在互联网上的作用,用于定位特定的数据项或功能。 #### Java实现...

    MIB的OID的编写规则和习惯(中文)

    OID(Object Identifier,对象标识符)是MIB中的关键元素,用于唯一地标识MIB中的每个管理对象。以下是对"MIB的OID的编写规则和习惯"的详细阐述: 1. **OID的基本结构**:OID是由一系列无符号整数组成的序列,每个...

    精通Hibernate:对象持久化技术第二版part3

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

    mib、snmp、oid相关介绍

    **对象标识符(OID)**是SNMP中用于唯一标识管理信息对象的关键概念。每个OID都是一个全局唯一的数字序列,类似于IPv6地址的格式,但具有更明确的层次结构。由于OID长度较长且数字构成,不易记忆,因此引入了MIB的...

    精通hibernate:对象持久化技术孙卫琴第二版part2

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

    Export & Import OID Data

    标题“Export & Import OID Data”涉及的是网络管理中对象标识符(OID)数据的导出与导入操作。OID是SNMP(简单网络管理协议)中用于唯一标识网络设备或对象的一种编码方式。在这个主题中,我们将深入探讨OID数据的...

    精通 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标识符生成器  ...

    HUAWEI-MIB-OID-S5700-V200R013C00.yaml

    华为设备支持自定义OID(对象标识符)的SNMPTrap,使得告警信息更具体、详细。例如,S5700-V200R013C00版本的MIB(管理信息库)包含了众多与设备状态、性能相关的OID,这些OID是识别和解析告警信息的关键。 其次,...

    Hibernate中单一映射笔记

    在本篇中,我们将深入探讨Hibernate中的单一映射机制,这是一种在Java应用程序中实现对象关系映射(ORM)的关键技术。Hibernate是一个流行的开源框架,它简化了与数据库的交互,通过对象模型自动处理数据的持久化。...

    面向对象数据库论文

    1. **对象标识符(OID)**:每个对象都有一个唯一的OID,用于唯一标识该对象。OID可以作为引用其他对象的基础,类似于关系数据库中的外键。 2. **对象链接**:OODB支持对象间的直接链接,通过OID实现对象之间的关联...

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

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

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

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

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

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

    Snmp+trap+mib开发代码

    这个过程包括解析MIB文件,映射对象标识符(OID)到具体的变量,以及查询和获取这些变量的当前值。 2. **设备数据的修改**:SNMP允许管理站对网络设备进行配置变更,如更改接口状态、设置阈值等。这通常涉及发送SET...

    UML类图在关系数据库中的实现

    一种优化的方法是在处理数据库关系时引入对象标识符(OID)的概念,即使用OID(对象唯一的标识符)作为数据库中所有表的主键。这样可以简化关系数据库的主键方案,避免在数据库更新时出现完整性问题,同时也可以减少...

Global site tag (gtag.js) - Google Analytics