`
paddy.w
  • 浏览: 505120 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 的id属性 unsaved-value详解

阅读更多
        初学hibernate时遇到的一点小疑问,网上找了一篇文章不错,在此拿来借鉴。感谢原作者。

当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:
Session session = ...;  
Transaction tx = ...;  
  
Parent parent = (Parent); session.load(Parent.class, id);;  
  
Child child = new Child();;  
child.setParent(parent);;  
child.setName("sun");;  
  
parent.addChild(child);;  
s.update(parent);;  
  
s.flush();;  
tx.commit();;  
s.close();;  

在上例中,程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么Hibernate应该自动产生session.update(child)这样的操作。

因此我们需要暗示一下Hibernate,究竟child对象应该对它自动save还是update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动update。那么Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。

unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)

当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)

当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送update(child)

例如下面的情况:
Session session = ...;  
Transaction tx = ...;  
  
Parent parent = (Parent); session.load(Parent.class, id); 
Child child = (Child); session.load(Child.class, childId); 
  
child.setParent(parent); 
child.setName("sun");  
  
parent.addChild(child); 
s.update(parent); 
  
s.flush();; 
tx.commit();  
s.close();  

child已经在数据库中有了,是一个持久化的对象,不是新创建的,因此我们希望Hibernate发送update(child),在该例中,Hibernate取一下child.getId(),和unsave-value指定的null比对一下,发现不相等,那么发送update(child)。

BTW: parent对象不需要操心,因为程序显式的对parent有load操作和update的操作,不需要Hibernate自己来判断究竟是save还是update了。我们要注意的只是child对象的操作。另外unsaved-value是定义在Child类的主键属性中的。
<class name="Child" table="child">  
<id column="id" name="id" type="integer" unsaved-value="null">  
  <generator class="identity"/>  
</id>  
...  
</class> 

如果主键属性不是对象型,而是基本类型,如int/long/double/...,那么你需要指定一个数值型的unsaved-value,例如:
unsaved-null="0"
分享到:
评论

相关推荐

    hibernate-mapping参数详解

    ### Hibernate Mapping 参数详解 在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping...

    hibernate映射文件的详解

    如果对象的标识属性值等于`unsaved-value`,Hibernate会认为该实例是新创建的,需要执行`save`操作;否则,执行`update`操作。 4. 主键生成器(Key Generator):用于决定如何生成对象的唯一标识(主键)。`...

    hibernate配置元素例子.txt

    &lt;id name="id" unsaved-value="null"&gt; &lt;/id&gt; ``` - **`name`属性**:指定主键字段的名称。 - **`unsaved-value`属性**:未保存状态的值,此处设置为`null`表示当实体处于未保存状态时,该字段的值为`null`。 - **`...

    hibernate配置详解

    &lt;id name="id" type="string" unsaved-value="null"&gt; &lt;column name="cat_id" sql-type="varchar(20)" not-null="true"/&gt; &lt;/id&gt; &lt;column name="NAME" sql-type="varchar(20)" not-null="true"/&gt; &lt;/...

    Hibernate开发指南

    - **关于unsaved-value**:解析了unsaved-value的概念及其应用场景。 - **Inverse和Cascade**:解释了这两个属性的意义以及如何正确使用它们。 - **延迟加载(LazyLoading)**:介绍了延迟加载的概念及其在...

    最经典的hibernate教程

    - `unsaved-value`: 未保存的值。 - `access`: 访问策略。 - **&lt;generator&gt; 元素**: 定义主键的生成策略。 - `class`: 生成器类名。 **3.3 &lt;property&gt; 元素** - 用于映射 Java 类中的属性到数据库表中的列。 -...

    夏昕-Hibernate+开发指南.pdf

    - **数据访问**:探讨了PO(Plain Old Java Object)和VO(Value Object)的区别,以及unsaved-value、Inverse和Cascade、延迟加载等概念。 - **事务管理**:介绍了基于JDBC和JTA的事务处理方法。 - **锁机制**:讲解...

    hibernate一对多例子

    &lt;id name="sid" type="string" unsaved-value="null"&gt; &lt;column name="sid" sql-type="char(32)" not-null="true"/&gt; &lt;/id&gt; &lt;column name="sname" sql-type="varchar(16)" not-null="true"/&gt; ...

    Hibernate_DEV_GUIDE

    - **关于unsaved-value**:这是Hibernate中的一种特殊属性设置,用于标识某个属性在对象未保存前的默认值。 - **Inverse和Cascade**:用于控制关联关系中对象的级联操作。 - **延迟加载(LazyLoading)**:这是一种...

    基于Struts+Hibernate+Spring的Web_应用开发

    &lt;id name="id" column="id" type="long" unsaved-value="any"&gt; &lt;/id&gt; ``` - **应用场景**:这有助于确保实体类与其对应的数据库表之间的映射一致性。当实体类需要扩展额外属性时,只需在实体类中添加即可...

    框架开发hibernate

    在Hibernate中,`unsaved-value`是一个特殊值,用于标记尚未保存到数据库的实体对象的状态。 #### Inverse和Cascade - **Inverse**:用于指定在关联关系中哪一方负责更新关系。 - **Cascade**:级联操作,用于控制...

    hbm.xml说明

    &lt;id name="id" type="java.lang.Long" column="ID" unsaved-value="null" generator-class="increment"/&gt; ``` #### 四、property标签 `property` 标签用于定义 Java 类的属性与数据库表中列之间的映射关系。它有...

    Hibernate 课件 pdf

    #### 三、Hibernate基础与高级特性详解 1. **Hibernate 基础工作** - **准备工作**: 包括搭建开发环境、配置 Hibernate 相关的依赖库等。 - **构建 Hibernate 基础代码**: 设计实体类、编写映射文件等。 - **...

    hibernate入门

    2. **关于unsaved-value**: 在Hibernate中,当对象的状态为unsaved时,表示该对象尚未保存到数据库中。 3. **Inverse和Cascade**: Inverse属性用于指定关联的哪一方负责维护关联关系;Cascade属性允许在一个操作...

Global site tag (gtag.js) - Google Analytics