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

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表为例:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值