• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Hibernate—JPA注解@DynamicUpdate与@DynamicInsert

java 来源:PI_PIBOY 27次浏览

@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)