Hibernate set null has no saved,则数据已被删除
Hibernate set null has no saved,then data has been deleted
实体:(省略部分属性)
存储空间:
@Entity
@Table(name = "t_storage")
public class Storage implements Serializable {
private static final long serialVersionUID = -8067092629525887737L;
@Id
@GeneratedValue
private Long id;
@Column
private String name;
@ManyToMany(fetch = FetchType.LAZY,cascade= CascadeType.REFRESH)
@JoinTable(name = "t_purchase_storage", joinColumns = {@JoinColumn(name = "storage_id") },inverseJoinColumns = { @JoinColumn(name = "purchase_id") })
private List<Purchase> purchases = Lists.newArrayList();
@ManyToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name = "auth_user_storage", joinColumns = {@JoinColumn(name = "storage_id")}, inverseJoinColumns =
{@JoinColumn(name = "user_id")})
private List<User> users = new ArrayList<>();
}
用户:
@Entity
@Table(name = "auth_user")
public class User implements Serializable {
private static final long serialVersionUID = 2577286098148701829L;
@Id
@GeneratedValue
private Long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "auth_user_storage", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns =
{@JoinColumn(name = "storage_id")})
private Set<Storage> storages = Sets.newHashSet();
@Column(name = "username")
private String username;
}
步骤:
1.want 到 select 一些存储空间
List<Storage> storageList = storageService.findAllStorage(null);
storageList.forEach(store -> {
store.setPurchases(null);
store.setCheckUsers(null);
store.setUsers(null);
store.setStorageBins(null);
});
return ResponseEntity.ok(JsonResult.success(storageList));
2.AopLog 调用了 UserServiceImpl 方法
controllerLog.setOperatorName(userService.findUserNameById(id));
此 serviceImpl 有 @Transaction
@Service
@Transactional
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public String findUserNameById(Long userId) {
return userRepository.findUsernameById(userId);
}
}
执行userRepository.findUsernameById时,则setnull前面的属性被删除
日志:
2021-03-29 17:04:06.991 [http-nio-7779-exec-1] INFO com.~~.api.web.log.AopLog - 【返回值】:<200 OK,class JsonResult {
code: 001
msg: ok
data: [com.~~.entity.Storage@21]
},{}>
Hibernate: delete from t_checkuser_storage where storage_id=?
Hibernate: delete from t_purchase_storage where storage_id=?
Hibernate: delete from auth_user_storage where storage_id=?
Hibernate: select username from auth_user where id=?
求解
去掉serviceImpl上的事务注解,就没有问题了。
或不设null,returnVO.
问题
我没有做任何保存或删除操作。为什么留空的属性会被删除?
当您使用 @Transactional
时,查询返回的实体在交易期间受到管理。这意味着在提交时,应用于实体的任何更改都将传播到数据库。因此,将这些值设置为 null 相当于对数据库进行更新查询。
当您删除 @Transactional
时,实体在查询返回后立即停止管理。因此,更改不会传播到数据库。
实体:(省略部分属性)
存储空间:
@Entity
@Table(name = "t_storage")
public class Storage implements Serializable {
private static final long serialVersionUID = -8067092629525887737L;
@Id
@GeneratedValue
private Long id;
@Column
private String name;
@ManyToMany(fetch = FetchType.LAZY,cascade= CascadeType.REFRESH)
@JoinTable(name = "t_purchase_storage", joinColumns = {@JoinColumn(name = "storage_id") },inverseJoinColumns = { @JoinColumn(name = "purchase_id") })
private List<Purchase> purchases = Lists.newArrayList();
@ManyToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name = "auth_user_storage", joinColumns = {@JoinColumn(name = "storage_id")}, inverseJoinColumns =
{@JoinColumn(name = "user_id")})
private List<User> users = new ArrayList<>();
}
用户:
@Entity
@Table(name = "auth_user")
public class User implements Serializable {
private static final long serialVersionUID = 2577286098148701829L;
@Id
@GeneratedValue
private Long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "auth_user_storage", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns =
{@JoinColumn(name = "storage_id")})
private Set<Storage> storages = Sets.newHashSet();
@Column(name = "username")
private String username;
}
步骤: 1.want 到 select 一些存储空间
List<Storage> storageList = storageService.findAllStorage(null);
storageList.forEach(store -> {
store.setPurchases(null);
store.setCheckUsers(null);
store.setUsers(null);
store.setStorageBins(null);
});
return ResponseEntity.ok(JsonResult.success(storageList));
2.AopLog 调用了 UserServiceImpl 方法
controllerLog.setOperatorName(userService.findUserNameById(id));
此 serviceImpl 有 @Transaction
@Service
@Transactional
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public String findUserNameById(Long userId) {
return userRepository.findUsernameById(userId);
}
}
执行userRepository.findUsernameById时,则setnull前面的属性被删除
日志:
2021-03-29 17:04:06.991 [http-nio-7779-exec-1] INFO com.~~.api.web.log.AopLog - 【返回值】:<200 OK,class JsonResult {
code: 001
msg: ok
data: [com.~~.entity.Storage@21]
},{}>
Hibernate: delete from t_checkuser_storage where storage_id=?
Hibernate: delete from t_purchase_storage where storage_id=?
Hibernate: delete from auth_user_storage where storage_id=?
Hibernate: select username from auth_user where id=?
求解
去掉serviceImpl上的事务注解,就没有问题了。
或不设null,returnVO.
问题
我没有做任何保存或删除操作。为什么留空的属性会被删除?
当您使用 @Transactional
时,查询返回的实体在交易期间受到管理。这意味着在提交时,应用于实体的任何更改都将传播到数据库。因此,将这些值设置为 null 相当于对数据库进行更新查询。
当您删除 @Transactional
时,实体在查询返回后立即停止管理。因此,更改不会传播到数据库。