当前位置: 首页 > news >正文

博罗做网站萝岗网站建设制作

博罗做网站,萝岗网站建设制作,建立企业网站的步骤,响应式建站工具什么时候需要使用cqrs在本文中#xff0c;我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate#xff1f; Hibernate非常流行。 从外观上看#xff0c;它也很容易#xff0c;而从内部看#xff0c;它却相当复杂。 它可以很容易地上手… 什么时候需要使用cqrs 在本文中我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate Hibernate非常流行。 从外观上看它也很容易而从内部看它却相当复杂。 它可以很容易地上手而无需深入了解滥用和发现问题因为已经为时已晚。 由于所有这些原因这几天真是臭名昭著。 但是它仍然是一项坚实而成熟的技术。 经过战斗测试功能强大文档齐全并且可以解决许多常见问题。 它可以使您*非常*高效。 如果包括工具和库则更多。 最后只要您知道自己在做什么它就是安全的。 自动模式生成 使SQL模式与Java类定义保持同步相当麻烦。 在最佳情况下这是非常繁琐且耗时的活动。 错误的机会很多。 Hibernate带有模式生成器hbm2ddl但其“本机”形式在生产中使用有限。 创建SessionFactory时它只能验证架构尝试更新或导出架构。 幸运的是该实用程序可用于自定义编程用途。 我们进一步走了一步并将其与CQRS预测集成在一起。 运作方式如下 当投影过程线程启动时请验证数据库模式是否与Java类定义匹配。 如果不是请删除该架构并重新导出使用hbm2ddl。 重新启动投影从一开始就重新处理事件存储。 从一开始就进行投影。 如果匹配则继续从当前状态更新模型。 由于这个原因在很多时候您几乎不必手动输入带有表定义SQL。 它使开发速度大大加快。 这类似于使用hbm2ddl.auto create-drop 。 但是 在视图模型中使用它意味着它实际上不会丢失数据 在事件存储中是安全的。 而且它非常聪明仅在实际更改架构时才重新创建架构-与创建-放置策略不同。 保留数据并避免不必要的重启不仅会缩短开发周期。 它还可能使其在生产中可用。 至少在某些条件下请参见下文。 需要注意的是并非架构中的所有更改都会使Hibernate验证失败。 一个示例是更改字段长度–只要是varchar或文本验证就可以通过而不受限制。 另一个未发现的变化是可空性。 这些问题可以通过手动重新启动投影来解决请参见下文。 另一种可能性是拥有一个不存储数据的伪实体但对其进行了修改以触发自动重启。 它可能只有一个名为schemaVersion字段每次架构更改时 Column(name v_4) schemaVersion Column(name v_4)批注由开发人员都会更新。 实作 实施方法如下 public class HibernateSchemaExporter {private final EntityManager entityManager;public HibernateSchemaExporter(EntityManager entityManager) {this.entityManager entityManager;}public void validateAndExportIfNeeded(ListClass entityClasses) {Configuration config getConfiguration(entityClasses);if (!isSchemaValid(config)) {export(config);}}private Configuration getConfiguration(ListClass entityClasses) {SessionFactoryImplementor sessionFactory (SessionFactoryImplementor) getSessionFactory();Configuration cfg new Configuration();cfg.setProperty(hibernate.dialect, sessionFactory.getDialect().toString());// Do this when using a custom naming strategy, e.g. with Spring Boot:Object namingStrategy sessionFactory.getProperties().get(hibernate.ejb.naming_strategy);if (namingStrategy instanceof NamingStrategy) {cfg.setNamingStrategy((NamingStrategy) namingStrategy);} else if (namingStrategy instanceof String) {try {log.debug(Instantiating naming strategy: namingStrategy);cfg.setNamingStrategy((NamingStrategy) Class.forName((String) namingStrategy).newInstance());} catch (ReflectiveOperationException ex) {log.warn(Problem setting naming strategy, ex);}} else {log.warn(Using default naming strategy);}entityClasses.forEach(cfg::addAnnotatedClass);return cfg;}private boolean isSchemaValid(Configuration cfg) {try {new SchemaValidator(getServiceRegistry(), cfg).validate();return true;} catch (HibernateException e) {// Yay, exception-driven flow!return false;}}private void export(Configuration cfg) {new SchemaExport(getServiceRegistry(), cfg).create(false, true);clearCaches(cfg);}private ServiceRegistry getServiceRegistry() {return getSessionFactory().getSessionFactoryOptions().getServiceRegistry();}private void clearCaches(Configuration cfg) {SessionFactory sf entityManager.unwrap(Session.class).getSessionFactory();Cache cache sf.getCache();stream(cfg.getClassMappings()).forEach(pc - {if (pc instanceof RootClass) {cache.evictEntityRegion(((RootClass) pc).getCacheRegionName());}});stream(cfg.getCollectionMappings()).forEach(coll - {cache.evictCollectionRegion(((Collection) coll).getCacheRegionName());});}private SessionFactory getSessionFactory() {return entityManager.unwrap(Session.class).getSessionFactory();} } 该API看起来过时且繁琐。 似乎没有从现有SessionFactory提取Configuration的方法。 这只是用来创建工厂并扔掉的东西。 我们必须从头开始重新创建它。 以上是我们需要的所有内容以使其与Spring Boot和L2缓存一起正常工作。 重新开始投影 我们还实现了一种手动执行此类重新初始化的方法在管理控制台中显示为按钮。 当有关投影的某些内容发生更改但不涉及修改架构时它会派上用场。 例如如果值的计算/格式不同但仍然是文本字段则可以使用此机制来手动重新处理历史记录。 另一个用例是修复错误。 生产用途 在开发过程中我们一直在成功使用这种机制。 它使我们可以通过仅更改Java类而不用担心表定义来自由地修改模式。 由于与CQRS相结合我们甚至可以维护长期运行的演示或试点客户实例。 数据始终在事件存储区中是安全的。 我们可以逐步开发读取模型架构并将更改自动部署到正在运行的实例中而不会丢失数据或手动编写SQL迁移脚本。 显然这种方法有其局限性。 仅在很小的情况下或事件可以足够快速地处理时才可以在随机的时间点重新处理整个事件存储。 否则可以使用SQL迁移脚本解决迁移问题但是它有其局限性。 这通常是冒险且困难的。 可能会很慢。 最重要的是如果更改较大并且涉及以前未包含在读取模型中的数据但事件中可用则根本不选择使用SQL脚本。 更好的解决方案是将投影带有新代码指向新数据库。 让它重新处理事件日志。 当它赶上来时请测试视图模型重定向流量并丢弃旧实例。 提出的解决方案也与此方法完美配合。 翻译自: https://www.javacodegeeks.com/2015/10/rapid-development-with-hibernate-in-cqrs-read-models.html什么时候需要使用cqrs
http://www.fuzeviewer.com/news/16764/

相关文章:

  • 河南网站优化推广百度口碑网
  • 1m带宽做网站怎么样2016网站开发语言
  • 谷歌生成在线网站地图大兴安岭网站推广
  • h5网站制作费用辽宁建设银行官方网站
  • 做移动网站点击软件吗企业如何在网站做认证
  • 2025年优质的装修材料管理服务权威榜
  • 装修公司网站平台专业团队什么梗
  • 苏州网站建设公司鹅鹅鹅推广服务
  • 福州网站怎么做seo运维需要掌握哪些知识
  • 怎样创建企业网站宁波专业网站营销
  • 校园网站建设培训简讯昆明网站建设价格
  • 2025年11月郑州离婚律师排行:五强对比与专业评价指南
  • 网站seo重庆网站的基础建设
  • 2025年11月品牌证明公司榜单:市场地位认证服务商对比评价
  • 2025年6月北京GEO优化公司推荐榜:五强对比分析与选型攻略
  • 网页前端开发网站网络维护服务合同模板
  • p2p网站建设哪家好开发公司与子公司合作协议
  • 专业的高密网站建设如何把网站放在主机上
  • 建设企业网站官网企业优化方案的格式及范文
  • 2025年11月折叠滤芯厂家排名:五家产业链完整度与口碑对比
  • 扬中网站建设效果建立企业网站的步骤
  • 中山网站建设公司排名中国国建设监理协会网站
  • .net网站封装网站建设昆明网络公司
  • 销售网站开发背景意义建站员工网站
  • html5 服装网站东莞网站建设开发价格
  • 创建企业网站网站建设公司推荐万维科技
  • 凌风科技wordpress杭州网站优化服务
  • 网站关键词用什么隔开wordpress ecommerce
  • 如何网上找加工订单百度网站排名seo
  • 2025年靠谱的玻璃钢直埋管道用户口碑最好的厂家榜