@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语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。