在java 的hibernate框架中,我有一个User类,其中有一个SealedObject 类型的属性 password,用来保存内存加密的用户密码,该属性的get方法是把SealedObject解密,转为字符串。数据库对应的user表中password的字段类型为varchar,我想利用hibernate的save方法把这个对象保存到数据库,我该如何配置hibernate,从而使我调用save方法的时候把SealedObject加密的原始密码保存到数据库中

时间: 2024-02-03 13:11:33 浏览: 24
首先,你需要在User类中添加一个用于保存加密密码字符串的字符串类型属性,例如:encryptedPassword。在该属性的set方法中,将传入的密码字符串加密并保存到password属性中。 然后,在Hibernate的映射文件中,你需要将password属性映射为数据库中的varchar字段,同时在保存时,使用encryptedPassword属性的值进行保存。 以下是一个示例映射文件: ``` <class name="com.example.User" table="user"> <id name="id" type="long"> <generator class="native"/> </id> <property name="username" column="username" type="string"/> <property name="password" column="password" type="sealed_object"/> <property name="encryptedPassword" column="password" type="string" insert="false" update="false"/> </class> ``` 在上面的映射文件中,password属性被映射为自定义的sealed_object类型,encryptedPassword属性被映射为varchar类型,并且在保存时不会更新到数据库中。这样,当你使用Hibernate的save方法保存User对象时,encryptedPassword属性的值会被忽略,而password属性的值会被加密后保存到数据库中。 注意,你需要自定义一个Hibernate类型,来将SealedObject类型映射为数据库中的类型。以下是一个示例自定义类型: ``` public class SealedObjectType implements UserType { private static final int[] SQL_TYPES = {Types.BLOB}; @Override public int[] sqlTypes() { return SQL_TYPES; } @Override public Class returnedClass() { return SealedObject.class; } @Override public boolean equals(Object o, Object o1) throws HibernateException { return Objects.equals(o, o1); } @Override public int hashCode(Object o) throws HibernateException { return Objects.hashCode(o); } @Override public Object nullSafeGet(ResultSet resultSet, String[] strings, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException { Blob blob = resultSet.getBlob(strings[0]); if (blob == null) { return null; } try (ObjectInputStream ois = new ObjectInputStream(blob.getBinaryStream())) { return ois.readObject(); } catch (IOException | ClassNotFoundException e) { throw new HibernateException(e); } } @Override public void nullSafeSet(PreparedStatement preparedStatement, Object o, int i, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException { if (o == null) { preparedStatement.setNull(i, Types.BLOB); } else { try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(o); oos.flush(); byte[] bytes = baos.toByteArray(); preparedStatement.setBinaryStream(i, new ByteArrayInputStream(bytes), bytes.length); } catch (IOException e) { throw new HibernateException(e); } } } @Override public Object deepCopy(Object o) throws HibernateException { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(o); oos.flush(); byte[] bytes = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (IOException | ClassNotFoundException e) { throw new HibernateException(e); } } @Override public boolean isMutable() { return true; } @Override public Serializable disassemble(Object o) throws HibernateException { return (Serializable) o; } @Override public Object assemble(Serializable serializable, Object o) throws HibernateException { return serializable; } @Override public Object replace(Object o, Object o1, Object o2) throws HibernateException { return o; } } ``` 在上面的示例中,我们使用Blob类型将SealedObject对象保存到数据库中,并实现了自定义类型的相关操作。你需要将这个类型添加到Hibernate的配置文件中,例如: ``` <property name="hibernate.type_contributors">com.example.SealedObjectTypeContributor</property> ``` 其中,SealedObjectTypeContributor是一个自定义的TypeContributor,用于注册我们自定义的类型。 最后,你需要在代码中使用Hibernate的save方法保存User对象,例如: ``` User user = new User(); user.setUsername("test"); user.setEncryptedPassword("123456"); session.save(user); ```

相关推荐

最新推荐

recommend-type

在Java的Hibernate框架中使用SQL语句的简单介绍

主要介绍了在Java的Hibernate框架中使用SQL语句的方法,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
recommend-type

Java中Hibernate的批量插入

Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作。例如我们调用Session的delete()方法,来删除持久化对象,Hibernate将负责删除对应的数据...
recommend-type

Java框架Bootstrap、HTML5、jQuery、Spring MVC、Hibernate、MySQL、Oracle、SQL Server、数据库

系统有4种皮肤主题,主要功能包括登录、注册、报表、找回密码、修改密码、用户管理、部门管理、菜单管理、字典管理、个人资料管理、信息发布管理、角色权限管理、邮件收发管理等等。 框架的数据持久层将添加、修改、...
recommend-type

Java框架Bootstrap、HTML5、jQuery、Spring MVC、Hibernate、向导、验证、UI组件、日历、相册、时间轴

系统有4种皮肤主题,主要功能包括登录、注册、报表、找回密码、修改密码、用户管理、部门管理、菜单管理、字典管理、个人资料管理、信息发布管理、角色权限管理、邮件收发管理等等。 框架的数据持久层将添加、修改、...
recommend-type

Hibernate-PPT(是一个很好的hibernate学习资料)

这个ppt有100多页,其中有些是我在学习过程中补进去,还加上一些别人的好的解析,看看。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Redis验证与连接:安装成功验证技巧

![Redis从入门到精通](https://img-blog.csdnimg.cn/6f39d0a2adc3456b96e804eb45032480.png) # 1. Redis安装与验证** ### 2.2 Redis验证方法 Redis验证可以通过以下方法进行: - **命令行验证:** - 打开终端,输入 `redis-cli` 命令进入 Redis 命令行。 - 输入 `ping` 命令,如果返回 "PONG",则表示 Redis 正在运行。 - **客户端验证:** - 使用 Redis 客户端(如 RedisInsight)连接到 Redis 服务器。
recommend-type

3、自定义一个函数int compareStr(char *p1, char *p2),实现两个字符串的比较。相等返回0,大于返回1,小于返回0;编写主函数main()来调用自定义函数完成测试。

下面是自定义的 `compareStr` 函数的代码实现: ```c #include <stdio.h> int compareStr(char *p1, char *p2) { while (*p1 && *p2 && (*p1 == *p2)) { p1++; p2++; } return (*p1 > *p2) - (*p1 < *p2); } int main() { char str1[100], str2[100]; int result; printf("请输入第一个字符串:");
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。