作者: yizhiwazi链接: https://www.Jian Shu.com/p/4931 FBC 52E a1
序言:如果直接调用本机Save方法,则null属性会复盖数据库,很难使用。 提供解决这个问题的方便方法。
核心思路
如果要保存当前的用户对象,请首先根据主键查询该用户的最新对象,然后将该用户对象的非空属性复盖为最新对象。
核心代码
直接更改通用JpaRepository的实现类,将该实现类标记为启动类即可。一、通用CRUD实现类
publicclasssimplejparepositoryimplextendssimplejparepository {
私有JPaentityinformationentityinformation;
私有最终实体管理器em;
@自动无线
publicsimplejparepositoryimpl (jpaentityinformationentityinformation,实体管理器实体管理器) {
实体信息,实体管理器;
this .实体信息=实体信息;
this.em=实体管理器;
}
//*
* * *通用保存方法:更新添加/选项
*/
@Override
@Transactional
公共保存(敏感) {
获取//id
身份id=(id )实体信息. getid )实体;
可选t;
if (字符串实用程序. isempty (实体id ) )
字符串uuid=uuid.random uuid () .字符串);
防止uid重复
if (查找字符() id () uuid ).is预置) ) )
uuid=UUID.randomUUID ().toString );
}
//id为空时,设定为UUID
newbeanwrapperimpl (实体) .设置属性值)实体信息. getid属性).getName ),uuid );
//标记为新数据
可选t=可选.空(;
} else {
//id不为空时查询最新数据
可选t=查找实体(实体id;
}
//获取空属性并使其为空
string [ ]空属性=getnullproperties (实体;
//id的查询结果为空时
if (! 可选的t.is present (
永久(实体; //添加
返回实体;
} else {
//1 .获取最新对象
t target=可选的t.get (;
//2 .将非空属性复盖到最新对象
beanutils .复制属性(实体、目标、空属性);
//3 .更新非空属性
合并(目标);
返回实体;
}
}
//*
* *获取对象的空属性
*/
privatestaticstring [ ] getnullproperties {
//1 .获取bean
beanwrappersrcbean=newbeanwrapperimpl;
//2 .获取bean属性的说明
属性描述符[ ] PDS=src bean.getproperty描述符(;
//3 .获取bean的空属性
set properties=新hashset (;
for (属性描述符属性描述符: PDS0)
字符串属性名称=属性描述符. getname (;
对象属性值=src bean.getproperty值(属性名称;
if (字符串实用程序. isempty (属性值) )
src bean.set属性值(属性名称,空);
属性名称;
}
}
返回属性.到阵列(新字符串[0];
}
}
二、启动系统
@ enablejparepositories (value=' com.hehe.repository ',存储库类=简单的存储库类) )
@SpringBootApplication
公共类JPA应用程序{
publicstaticvoidmain (字符串[ ]数组) {
spring应用程序. run (JPA应用程序.类,args;
}
}
三、实体类和通用Save
@Entity
@ table (名称=' t _ user ' ) ) )。
@ jsonignoreproperties ((处理程序,) hibernateLazyInitializer'} ) )
公共类用户
@Id
专用字符串用户id;
私有字符串用户名;
私有字符串密码;
省略GET/SET
}
公共安全委员会资源仓库扩展数据库{
}
四、概要文件application.yml
spring:
数据源:
URL : JDBC : MySQL ://Localhost :3306/Socks? use SSL=假
用户名:超级用户
密码:路由
驱动器类-名称: com.MySQL.JDBC .驱动器
五、数据库脚本
drop表if exists t _用户;
创建表t _用户(
user _ id虚拟符号(50 )、
用户名虚拟人物(50岁)、
密码虚拟容器(50 ) )。
);
插入入-用户值(1、管理员、管理员);
插入用户值('2',' yizhiwazi ',' 123456 );
六、测试代码
@ rest控制器
公共类用户控制器
@自动无线
私有用户存储库存储库;
@ request映射((/) ) ) )。
公共用户获取()
用户资料档案库. save (新用户('1',',空);
returnuserrepository.find byid ('1' ).get );
}
}
整体结构图
在实际项目中,可以直接复制和使用SimpleJpaRepositoryImpl,而不会影响原始的其他API。