2015-11-12 37 views
2

我有一组应用程序(运行在不同的JVM上),其中实体Student被保存到数据库(共享数据库)中。我想创建一个仪表板系统,它将几乎实时地更新网页,有多少学生已被保存(注册到系统中)。因此,我认为我会引入拦截器或侦听器(因为所有应用程序都使用休眠),而不是找到学生保存在大代码库中的地方。我将介绍一个缓存层,它将更新代表学生信息的缓存,而不是点击数据库(我的数据库已经过载),我可以使用缓存层获取有关学生注册的信息。hibernate拦截器跟踪对象并更新第三方缓存

仪表板如下所示。 学生总数:120

最近登记:

用户A [时间戳]

用户B [时间戳]

... ..

我就如下保证我的系统工作正常。

  1. 我需要确保用户致力于数据库。我不确定如果 onSave()方法保证提交到数据库。
  2. afterTransactionCompletion确实听起来像在 事务提交/回滚之后调用它,但不会给我实体 对象,我将用它来更新缓存。
+0

问题是什么? –

+0

问题是onSave()或afterTrasactionCompletion中的哪一个适合我的工作?还是有更好的方法。 –

回答

0

所以不是发现那里的学生都保存在一个大 代码库的地方,我想我会介绍拦截器或接收器(因为 所有应用程序使用Hibernate)。

我觉得很奇怪。无论你有什么大代码,应该只有一个地方将学生保存到DB中:StudentRepository。此存储库可以注入您的UnitOfWork实例,并且该UnitOfWork应该有addAfterTransactionHandler()方法。我相信这解决了你的问题。

+0

那么,我的大代码库(基本上不同的系统,因此jvms)遵循不同的编码实践(不一定是域驱动的设计)。奇怪吗?是的,他们是旧代码,我不想去碰它们。 还addAfterTransactionCommit()(我认为你的意思是)交易传递给它。不是我可以使用的实体。我如何得到这个?作为拦截器,这将被许多其他提交者调用。 –

+0

@TheNeoNoirDeveloper我看到。那么,你现在处于困难的位置;)顺便说一句,我不确定Repository模式只属于DDD。它通常用于[ISP](https://en.wikipedia.org/wiki/Interface_segregation_principle)(从其余代码中分离数据库查询)。 –