关于springboot中持久化bean 被set后自动更新

本文探讨了在Java持久化API(JPA)中,如何管理从数据库提取的Bean的状态,防止意外更新。介绍了两种方法:一是创建VO对象进行属性拷贝;二是利用entityManager的evict或detach方法改变Bean状态。

分析:bean通过jpa从数据中提取出来,仍旧处于持久化状态。所以任何更新将导致session提交时候,自动触发持久化bean的更新

解决方案:

1.新建bean对于的vo对象,属性拷贝,更新vo数据后就不会自动更新,缺点:创建更多重复对象

2.使持久状态改为游离状态。

entityManager获取session 调用evict(持久对象) 单个对象

或者

entityManager 调用 detach(持久对象) 方法

参考对象状态转变

new 对象->瞬时态 
瞬时态--save/saveOrUpdate->持久态 
持久态--session.close/clear/evict->游离态->session.save/session.saveOrUpdate/session.lock->持久态 
持久态--session.delete->瞬时态 
游离态--session.delete->瞬时态 

 

### Spring Boot 实现多用户角色持久化最佳实践 在Spring Boot项目中实现多用户角色的持久化,通常需要结合数据库设计、实体类建模以及权限控制。以下是实现这一目标的最佳实践: #### 1. 数据库设计 为了支持多用户角色,数据库设计应包含以下表结构: - **用户表 (User)**:存储用户的详细信息。 - **角色表 (Role)**:存储系统中的角色定义。 - **用户-角色关联表 (User_Role)**:用于建立用户和角色之间的多对多关系。 示例SQL脚本如下: ```sql CREATE TABLE User ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, email VARCHAR(100), enabled BOOLEAN DEFAULT TRUE ); CREATE TABLE Role ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE User_Role ( user_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (user_id, role_id), FOREIGN KEY (user_id) REFERENCES User(id), FOREIGN KEY (role_id) REFERENCES Role(id) ); ``` 此设计允许一个用户拥有多个角色,并且每个角色可以被多个用户共享[^1]。 #### 2. 实体类建模 基于上述数据库设计,创建对应的实体类并使用JPA注解进行映射。 **User实体类** ```java @Entity @Table(name = "User") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; private String email; private Boolean enabled; @ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "User_Role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private Set<Role> roles = new HashSet<>(); // Getters and Setters } ``` **Role实体类** ```java @Entity @Table(name = "Role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Getters and Setters } ``` 通过`@ManyToMany`注解,定义了用户和角色之间的多对多关系[^4]。 #### 3. 权限控制 在Spring Boot中,可以使用Spring Security来管理用户认证和授权。配置Spring Security以支持多角色验证。 **Spring Security配置** ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") .antMatchers("/").permitAll() .and() .formLogin() .permitAll() .and() .logout() .permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 此配置确保不同用户角色只能访问其权限范围内的资源[^3]。 #### 4. 测试与验证 为确保多用户角色功能正常运行,可以使用测试切片来编写单元测试或集成测试。例如,验证用户是否能够成功登录以及是否具有正确的角色权限[^3]。 **测试代码示例** ```java @SpringBootTest @AutoConfigureMockMvc public class UserControllerTest { @Autowired private MockMvc mockMvc; @Test public void testAdminAccess() throws Exception { mockMvc.perform(get("/admin/dashboard") .with(user("admin").roles("ADMIN"))) .andExpect(status().isOk()); } @Test public void testUserAccessDenied() throws Exception { mockMvc.perform(get("/admin/dashboard") .with(user("user").roles("USER"))) .andExpect(status().isForbidden()); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值