Spring Data Jpa使用注意点汇总
@CreatedBy @LastModifiedBy注意点
@CreatedBy表示创建该条记录的是当前登录的账号
@LastModifiedBy表示当前登录的账号更新该条记录
示例:假设我们有这样一个需求,当查询指定用户的默认分组不存在时,新建(重点:当前登录的用户与指定用户不同)
1、分组Group实体
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "group")
@EntityListeners(AuditingEntityListener.class)
public class Group extends BaseModel {
// 省略其他属性
/** 创建者 */
@CreatedBy
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "create_by")
@JsonIgnore
private User createBy;
/** 更新者 */
@LastModifiedBy
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "update_by")
@JsonIgnore
private User updateBy;
}
2、查询,当不存在时保存
private Group findDefaultGroup(User targetUser) {
Group group = groupRepository.findByCreateByAndStatus(targetUser, 1);
if (Objects.isNull(group)) {
group = new Group();
// 省略其他赋值
group.setCreateBy(targetUser);
group.setUpdateBy(targetUser);
return groupRepository.save(group);
}
return group;
}
3、当前登录用户ID为1,指定targetUser用户ID为2,当执行groupRepository.save(group)后,返回group对象的createBy、updateBy属性值都为登录用户(即ID为1),不是指定的ID为2的用户,
如果想要达到save(group)后返回对象的createBy、updateBy属性值是ID为2的用户,则去掉Group实体的这2个注解即可
4、最终结果
/** 创建者 */
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "create_by")
@JsonIgnore
private User createBy;
/** 更新者 */
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "update_by")
@JsonIgnore
private User updateBy;
保存记录后返回ID
当调用jap的save(entity)方法,想拿到entity的ID
不能直接用entity.getId();正确的做法是使用返回的结果获取ID
示例:
Entity en = repository.save(entity);
return en;
// 错误的方法,不能想mybatis一样直接用,这样获取到的ID为null或0
entity.getId();
// 获取ID
en.getId();