spring data jpa lombok难解难分

本文讨论了在Spring Data JPA中使用Lombok注解@Data时遇到的问题,特别是在处理用户和角色、作者和文章等多对多或一对多关系时,若在主动维护关系的一方使用@Data可能导致内存溢出。解决方案是在被维护端避免包含维护端的对象,并使用Lombok的@Setter和@Getter代替手动getter和setter。测试表明,即使被维护端不直接配置多对多关系,仍能正确创建中间表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户和角色表的多对多的关系
用户表加了lombok@Data的注解不报异常
能正常的操作,但是角色表就加不了@Data的注解
1.会报内存溢出
2.角色表用setter 和getter 方法和to String 方法
toString 方法一定不能重写 用户对象
不然也是报内存溢出
当然了角色表中用lombok的
@Setter
@Getter
注解来代替手动的getter和setter也是可以的

=====================================
作者和文章的一对多的关系
文章表加lombok@Data的注解不报异常,能正常的操作,但是作者表就加不了@Data的注解会报内存溢出,如果手动重写to String 方法的话也是不能
不能重写 文章对象不然也会报内存溢出,用
当然了作者表中用lombok的
@Setter
@Getter
注解来代替手动的getter和setter也是可以的

总结来看:
无论时多对多还是一对多,都得看谁是维护的一方,或者说是主动的一方,操作的一方,在这一方,加
lombok@Data注解没有问题,但是另外一方就有问题,如果手动生成的话也不能重写对方的对象
猜想问题是出现在toString方法上
但具体怎么回事不清楚,在这里记录以便以后查看

注:下面的用户表和角色表多对多的关系就没有报异常

@Entity
@Table(name = "rbac_user")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true,length = 16,nullable = false)
    private String account;

    @Column(nullable = false,length = 128)
    @JsonIgnore
    private String password;

    @Column(name = "user_name",length = 32)
    private String userName;

    private String tel;

    private Boolean enable = false;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "rbac_user_role",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles;

}
@Entity
@Table(name = "rbac_role")
@Data
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false,length = 32,unique = true)
    private String roleName;

    @Column(nullable = false,length = 32,unique = true)
    private String roleKey;

    private Boolean enable = false;

    private String description;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "rbac_role_permission",
            joinColumns = @JoinColumn(name = "role_id"),
            inverseJoinColumns = @JoinColumn(name = "permission_id")
    )
    @JsonIgnore
    private Set<Permission> permissions;
}

使用的时候主表,维护端,操作方可以加lombok@Data注解,被维护端不要出现维护端的对象就可以加lombok@Data注解了
果然经过我的测试就是这样
看下面的列子:

@Entity
@Table(name="sys_user")
@Data
public class SysUser {
	/**  
	 * @author: leebob  
	 * @date:   2020年4月24日 下午9:47:06   
	 * 关系维护端,操作的一方,主动的一方
	 */
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="user_id")
	private Long userId;
	@Column(name="user_code")
	private String userCode;
	@Column(name="user_name")
	private String userName;
	@Column(name="user_password")
	private String userPassword;
	@Column(name="user_state")
	private String userState;
	
	//多对多关系映射
	@ManyToMany
	@JoinTable(name="sys_user_role",
	  joinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")},
	  inverseJoinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")}
)
	private Set<SysRole> roles ;
	}
@Entity
@Data
@Table(name="sys_role")
public class SysRole {
	/**  
	 * @author: leebob  
	 * @date:   2020年4月24日 下午9:48:04   
	 * 关系被维护端,被动的一方
	 */
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="role_id")
	private Long roleId;
	@Column(name="role_name")
	private String roleName;
	@Column(name="role_memo")
	private String roleMemo;
	}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SysUserDemoTest {
	/**  
	 * @author: leebob  
	 * @date:   2020年4月22日 下午12:18:05   
	 */
	  @Autowired
	 private  SysUserDao  userDao;
	  @Autowired
	 private  SysRoleDao  roleDao; 
	    @Test
	    @Transactional
	    @Rollback(value = false)
        public void    saveSysRole() {
	    	//创建对象
			SysRole r1 = new SysRole();
			r1.setRoleName("角色1");
			SysRole r2 = new SysRole();
			r2.setRoleName("角色2");
			
		 	roleDao.save(r1);
		    roleDao.save(r2);
        }

	    @Test
	    @Transactional
	    @Rollback(value = false)
	    public void    saveUserRole2() {
	    	Set<SysRole>  rolelist=new HashSet<>();	    	                   
	    	SysUser u1 = new SysUser();
	    	u1.setUserName("用户2");	
	    	//查询所以的角色
	    	List<SysRole> roles = roleDao.findAll();
         for (SysRole sysRole : roles) {
			        rolelist.add(sysRole);
		}
            //给用户设置角色
            u1.setRoles(rolelist);
            //保存用户并且保存用户的所以角色
	    	userDao.save(u1);    	    	
	    }
	    
	    @Test
	    @Transactional
	    @Rollback(value = false)
	    public void    testfind() {
	        //这里查询所有也不会报内存溢出
 	    	List<SysUser> users = userDao.findAll();  	
    	   users.forEach(System.out::println);
	    }
	    
}

由此可见,被维护端可以不加维护端的对象集合,就可以加lombok@Data的注解了,简单省事
可能有人会想被维护端没有配置多对多关系,还会生成中间吗?
答案是肯定的
也就是说,多对多的关系配置,可以直接在维护端设置,而关系被维护端可以不需要设置,照样可以创建出三张表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值