Hibernate、jpa 的dynamic-insert和dynamic-update的使用

本文介绍如何在JPA中使用数据库表的default属性动态插入与更新字段值,包括配置步骤与实例演示。

JPA插入或者修改数据的时候使用数据库表的default值(JPA动态插入动态更新)

使用JPA的时候,当我们插入数据的时候,我们不仅可以自己在model类里面赋初值,还可以使用数据库表的default值。希望大家通过以下对JPA学习,能对大家有帮助。

  让我们开始进行JPA学习吧。首先,我们在model类里面为column设置数据库default值,以前使用Hibernate的时候的做法是添加sql-type,例如:
<property name="viewDate" not-null="false" type="java.util.Date">  
   <column name="viewDate" sql-type="datetime; default getdate()"/>  
</property>

JPA里面使用columnDefinition代替sql-type:
    @Column(columnDefinition="datetime default getdate()")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date viewDate;

那么,当我们的generateDdl设为true的时候,可以在数据库生成表,而且viewDate字段会带一个默认值getdate(),当我们的sql语句不带viewDate字段的时候,就会使用到getdate()去取数据库的系统时间。

以前Hibernate的做法是添加dynamic-insert="true"和dynamic-update="true" 。但是JPA好像没有这个功能。如果你的JPA的Privider
是Hibernate的话可以添加如下Annotation为我们的实体提供dynamic-insert,dynamic-update,如下:
@Entity
@org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)
public class MyEntity{
//省略其他字段
......
    @Column(columnDefinition="datetime default getdate()")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date viewDate;
//注意,这里不要给viewDate一个初始值,例如viewDate = new Date();是错的。只有null才会在加入的时候,使用到dynamicInsert
//省略getter,setter
......
}

那么,当加入一条MyEntity记录的时候,我们的viewDate为null,就可以取数据库时间了。希望通过JPA学习,能帮到大家获得需要的知识。

===========================

 

Hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的SQL语句放在session中,其中insert,update,select操作都是对表的所有字段操作.如果在一个表有很多字段的时候,在做初次inser的时候有比较多的字段为空值,或者经常update某少部分字段,应该在配置文件的<class>元素上将dynamic-insert和dynamic-update设置为true.其默认值都为false.

如有这样一张表:create table hbtest(id int,val1 varchar2(100),val2 varchar2(100));

1,在 dynamic-insert没有设置的时候


<class name="com.test.hb.dynamicupdate.Hbtest" table="HBTEST">


            Hbtest tbo = new Hbtest();
            tbo.setId(new Integer(2));
            tbo.setVal1("val1");

            sessionFactory.getCurrentSession().save(tbo);

某些字段为空做insert,hibernate会用全字段的insert sql语句,如下:

insert into HBTEST(VAL1, VAL2,ID) values(?, ?,?)

2,将dynamic-insert设置为true,同样的保存,hibernate会动态生成SQL语句,没有值的字段不会出现在insert语句中.

<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" table="HBTEST">


insert into HBTEST(VAL1, ID) values(?, ?)

3,在 dynamic-update没有设置的时候

            Hbtest tbo = (Hbtest) sessionFactory.getCurrentSession().load(Hbtest.class,new Integer(1));           
            tbo.setVal1("valXX");           
            tx.commit();

只更新部分字段,hibernate仍然对所有字段做更新:


update HBTEST set VAL1=?,VAL2=? where ID=?

4,同样的操作如果把设置为true的话,sql语句只包含更新的字段:update HBTEST set VAL1=? where ID=?

<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" dynamic-update="true" table="HBTEST">

5,Hibernate这种动态SQLupdate的特性是利用在对象从数据库加载到hibernate session的时候保存了一份快照,做更新的时候与这个快照做比较,只更新改动过的值.

所以下面这种情况就会用全部字段进行更新:,不设值的字段会被更新成null.

            Hbtest tbo = new Hbtest();
            tbo.setId(new Integer(1));
            tbo.setVal1("val1ZZZ");
            sessionFactory.getCurrentSession().update(tbo);   
这种情况应该利用Hibernate提供的对SQL的支持,用SQL做更新操作.

 

=====================

ibatis--部分更新表记录字段的方法

使用ibatis,如果要更新表记录,一般常用的做法就是,查找出记录,然后修改部分字段,进行update操作.
以member表为例:

使用ibatis,如果要更新表记录,一般常用的做法就是,查找出记录,然后修改部分字段,进行update操作.
以member表为例:
hibernate-jpa-2.1-api 1.0.2是一个Java持久化规范的实现库。它是基于JPA(Java Persistence API)2.1规范的Hibernate实现。Hibernate是一个流行的ORM(对象关系映射)框架,用于在Java应用程序关系数据库之间进行数据持久化。 该版本的hibernate-jpa-2.1-api是对JPA 2.1规范的实现,并且是Hibernate团队为了确保应用程序与Java EE 7兼容性而发布的一个版本。 JPA是一种使用对象模型操作数据库的标准规范,它提供了一组API,使开发人员可以使用面向对象的方式访问操作数据库。Hibernate作为一个JPA的实现,提供了许多附加的功能特性,使得开发人员可以更加简化灵活地进行数据库操作。 通过使用hibernate-jpa-2.1-api,开发人员可以使用JPA的标准API,以及Hibernate提供的独有特性,来实现应用程序的数据持久化需求。它提供了实体管理器,用于管理实体对象的生命周期,以及CRUD操作。此外,它还提供了用于查询各种持久化注解的支持。 通常情况下,使用hibernate-jpa-2.1-api需要将其添加到项目的依赖中,并与其他必需的Hibernate库一起使用。开发人员需要熟悉JPA的基本概念API,并且理解Hibernate特有的扩展配置选项。 总的来说,hibernate-jpa-2.1-api 1.0.2提供了开发人员在使用JPA进行数据持久化时的基本工具功能。它是Hibernate团队为了支持JPA 2.1规范而发布的一个版本,开发人员可以使用它来简化灵活地操作数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值