java - 如何将监听 hibernate 事件的模块与实体本身分离?

标签 java hibernate circular-dependency elasticsearch

我有一个由 spring-jpa-hibernate 驱动的分层网络应用程序,我现在正在尝试集成 elasticsearch(搜索引擎)。

我想做的是捕获所有 postInsert/postUpdate 事件并将这些实体发送到 elasticsearch,以便它重新索引它们。

我面临的问题是我的“dal-entities”项目将对“search-indexer”产生运行时依赖,而“search-indexer”将对“dal-entities”产生编译依赖,因为它需要为不同的实体做不同的事情。

我考虑过将“搜索索引器”作为 DAL 的一部分(因为可以说它对数据进行操作),但它仍然应该作为 DAO 部分的一部分。

我认为我的问题可以改写为:我如何在 hibernate 事件监听器中拥有不能单独封装在实体项目中的逻辑(因为这不是它的责任)。

更新
dal-entities 项目依赖于索引器的原因是我需要在 spring 配置文件中配置监听器,该文件负责 jpa 上下文(显然驻留在 dal-entities 中)。
依赖关系不是编译时范围而是运行时范围(因为在运行时 hibernate 上下文将需要该监听器)。

最佳答案

答案是接口(interface)。

与其直接依赖于各种类(在任一方向),您还可以依赖于显示您需要的功能的接口(interface)。这样,您就不会直接依赖于类,而是依赖于接口(interface),并且您可以拥有“dal-entities”所需的接口(interface),例如,与dal 实体和索引器只是实现该接口(interface)。

这并没有完全消除依赖性,但它确实让您的耦合不那么紧密,并使您的应用程序更加灵活。

如果您仍然担心事物耦合过于紧密,或者如果您真的根本不希望这两个部分循环依赖,那么我建议您重新考虑您的应用程序设计。在 SO 上提出另一个问题,详细了解您的一些代码以及如何更好地构建它可能会得到一些关于如何改进设计的好建议。

关于java - 如何将监听 hibernate 事件的模块与实体本身分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8987234/

相关文章:

mysql - JDBC MySQL 字符编码 : Why is useUnicode required?

c++ - 头文件〜语法错误(要求括号)

angular - 检测到循环依赖项中的警告 - Angular Cli

java - parseInt() 在子字符串操作删除字符后表现奇怪

java - 学习Java中的线程,发现某些方面理解有困难

java - Spring Jpa - hibernate 在数据库中保存一行空值

java - 带有 IN 子句的 Spring Data JPA 中的 NPE

python - 如何处理tastypie中的循环导入

java - 函数返回 NaN

java - 用随机数创建一个数组