Hibernate---JPA注解@DynamicUpdate与@DynamicInsert

@DynamicInsert属性(默认为false):

如果将其设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中。

比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。

@DynamicUpdate属性(默认为false):

如果将其设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中。

比如只想更新某个属性,我更改了哪些字段,只会更新我们修改的字段。

 

效果:

这两个注解在一定程度上可以增加与数据库操作相关的速度,可以节省SQL语句的执行时间,提高程序的运行效率。

使用这两个注解只需要在实体类上加入即可,或者在*.hbm.xml配置。这两个注解是boolean值,true或者false。

实体类

/**
 * @description: TODO
 * @author: PIPI
 */
@Entity
@Table(name="Room")
@Data
@DynamicUpdate
public class Room implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false, unique = true)
    private Integer roomId;

    private String roomNumber;

    private Integer aricNum;//空调数

    private Integer lightNum;

    private Integer fanNum;

    private Integer switchNum;

    private Integer deskNum;

    private Integer chairNum;

    private Integer nediaNum;//多媒体数

    private Integer clockNum;//

    private Integer boardNum;

    private Integer roomStatus;

    private Integer roomType;//区分教室和休息室

    private Integer teaDesk;

    private Integer sofa;

    private Integer Sterilizer;//消毒柜

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH},
            fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "building_id")
    @NotFound(action=NotFoundAction.IGNORE)
    private Building building;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH},
            fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "floor_id")
    @NotFound(action=NotFoundAction.IGNORE)
    private Floor floor;

    @JsonIgnore
    @ManyToMany(mappedBy = "rooms", fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    private Set<Cleaner> cleaners=new HashSet<Cleaner>();

}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class RoomRepositoryTest {
    @Autowired
    private RoomRepository roomRepository;

    @Test
    @Transactional
    public void flushOne(){
        Room room = roomRepository.getOne(476);
        room.setChairNum(130);
        roomRepository.saveAndFlush(room);
    }
}

没加注解@DynamicUpdate,sql语句为:

Hibernate: update room set sterilizer=?, aric_num=?, board_num=?, building_id=?, chair_num=?, clock_num=?, desk_num=?, fan_num=?, floor_id=?, light_num=?, nedia_num=?, room_number=?, room_status=?, room_type=?, sofa=?, switch_num=?, tea_desk=? where room_id=?

我只更新了chairNum这个属性,但是却把整个对象的属性都更新了,这在一定程度是影响了效率。而且可能并不是我们希望的结果,我们希望的结果是我更改了哪些


加了注解@DynamicUpdate,sql语句为:

Hibernate: update room set chair_num=? where room_id=?

结论:

在Hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值