我有一个由spring-jpa-hibernate驱动的分层Web应用程序,我现在正在尝试集成elasticsearch(搜索引擎)。
我想要做的是捕获所有postInsert / postUpdate事件并将这些实体发送到elasticsearch,以便重新索引它们。
我面临的问题是我的“dal-entities”项目将对“搜索索引器”具有运行时依赖性,而“搜索索引器”将对“dal-entities”具有编译依赖性,因为它需要为不同的实体做不同的事情。
我想过将“搜索索引器”作为DAL的一部分(因为它可以说它对数据进行了操作),但即使它仍然应该作为DAO部分的一部分。
我认为我的问题可以改为:我如何在hibernate事件监听器中拥有逻辑,而不能仅仅在实体项目中封装(因为它不是它的责任)。
更新
dal-entities项目依赖于索引器的原因是我需要在spring配置文件中配置监听器,该文件负责jpa上下文(显然位于dal实体中)。
依赖项不是编译时范围,而是运行时范围(因为在运行时,hibernate上下文将需要该侦听器)。
答案 0 :(得分:1)
答案是接口。
不是直接依赖各种类(在任何一个方向上),而是依赖于能够显示所需功能的接口。这样,你不是直接依赖于类,而是依赖于接口,并且你可以拥有“dal-entities”所需的接口,例如,生活在与dal-entities和索引器只是实现了该接口。
这不会完全删除依赖项,但它 会让你的耦合更紧凑,并使你的应用程序更灵活。
如果你仍然担心事情过于紧密,或者你真的不希望这两件事完全依赖,那么我会建议你重新考虑你的应用程序设计。在SO上提出另一个问题,详细了解一些代码以及如何更好地构建代码,可能会对如何改进设计提出一些好的建议。
答案 1 :(得分:0)
Hibernate支持PostUpdateEventListener和PostInsertEventListener。
以下是good example,可能适合您的情况
主要概念是能够找到您的实体何时被更改并按照此处所示进行操作。
public class ElasticSearchListener implements PostUpdateEventListener {
@Override
public void onPostUpdate(PostUpdateEvent event) {
if (event.getEntity() instanceof ElasticSearchEntity ) {
callSearchIndexerService(event.getEntity());
Or
InjectedClass.act(event.getEntity());
Or
callWebService(InjectedClassUtility.modifyData(event.getEntity()));
........
}
}
编辑
您可以考虑使用spring注入要与项目隔离的类(包含逻辑)。
另一个选项可能是调用不依赖于您的代码的外部Web服务。 将原始项目对象或由实用程序修改的对象传递给它,以适应elasticsearch。