我有一段代码基本上是通过 Hibernate 从数据库中检索 Bean 对象,在将其存储回数据库之前对两个或三个属性的值进行一些更改。
让我们看一个真实的例子。我的应用程序的目的是让几个人参加 MCQ 测试。为了防止在每次用户提交答案时更新分数而使数据库过载,我将分数计数器存储在 aHashMap
中,该计数器将在测试结束时刷新到数据库中。我还需要更新时间戳,指示测试结束的时间。
我目前的设计涉及两个功能。
这第一个函数将分数从 刷新HashMap
到数据库。
private void flushScoreToDatabase(String id) {
int score = scoreMap.get(id);
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
try {
session.beginTransaction();
Student student = (Student)session.get(Student.class, Integer.parseInt(id));
student.setScore(score);
session.getTransaction().commit();
scoreMap.remove(id);
} catch (HibernateException e) {
session.getTransaction().rollback();
}
}
第二个功能将涉及更新时间戳。
private void updateTimestamp(String id) {
Session session = Hibernate.getSessionFactory().getCurrentSession();
try {
sesssion.beginTransaction();
Student student = (Student)session.get(Student.class, Integer.parseInt(id));
student.setEndTime(timestamp);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
}
}
这两个函数都将被另一个函数包装,该函数id
从经过身份验证的会话中获取用户的 。
这是相当昂贵的,因为这涉及两个SELECT
语句以及两个UPDATE
语句,只是为了为同一用户更新两个不同的属性。
在遵守 SRP 的同时,有没有更简洁的方法来设计代码?