我正在开发一个复式记帐系统,我需要在顺序 ID 中插入没有任何间隙的过帐记录。由于所有数据库访问都将通过 Web 应用程序进行,因此我使用同步静态变量来处理 id 生成:
import org.hibernate.*;
public class JournalService {
private static Object journalLock = new Object();
private Session session;
public JournalService(Session session) {
this.session = session;
}
public void insertJournalEntry(JournalEntry journalEntry) {
Set<PostEntry> entries = journalEntry.getEntries();
double total = 0;
for (PostEntry entry : entries) {
total += entry.getAmount();
}
if(total != 0)
throw new InvalidParameterException("Journal entry is invalid. The sum of all entries must be zero.");
Criteria criteria = session.createCriteria(PostEntry.class);
criteria.setMaxResults(1);
criteria.addOrder(Order.desc("id"));
//here I add some other criteria
synchronized(journalLock) {
PostEntry lastEntry = criteria.uniqueResult();
long currentId = lastEntry.getId();
for (PostEntry entry : entries) {
entry.setId(currentId++)
session.save(entry);
}
session.save(journalEntry);
}
}
}
简而言之,该服务的生命周期与当前的 httprequest 相关联,并由 spring 容器管理,此外我确保整个事务在请求结束时提交。同步块将处理任何并发,因此在 id 的序列中不会发生任何间隙。这里最大的问题是增加了数据库访问的开销,用于选择与特定条件匹配的最后插入的记录。我不希望这种情况发生,所以我猜这里的解决方案是使用一个缓存,该缓存将在第一次被选中时保存最后插入的记录,因此生成 id 不需要数据库访问。我的问题:有没有开箱即用的休眠方式来解决这个问题?我是休眠新手,听说过查询缓存,但我不确定如何使用它。我不 我不希望缓存保存我使用此服务存储的每个值,我只需要它来存储与特定条件匹配的最后插入的条目。例如,如果我执行了五次插入,其中两个匹配相同的条件“X”,另外三个匹配条件“Y”,缓存将只存储两个对象(匹配每个条件的最后插入的对象)。我可以自己轻松地实现这一点,但我更愿意使用与 hibernate API 集成的解决方案。缓存将只存储两个对象(匹配每个条件的最后插入的对象)。我可以自己轻松地实现这一点,但我更愿意使用与 hibernate API 集成的解决方案。缓存将只存储两个对象(匹配每个条件的最后插入的对象)。我可以自己轻松地实现这一点,但我更愿意使用与 hibernate API 集成的解决方案。