我看到,自从Hibernate 4为了从配置中获取Session Factory,我们需要使用ServiceRegistry。
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
ServiceRegistry的目的是什么?为什么需要它?
答案 0 :(得分:1)
他们重新设计了sessionFactory以将参数作为Serviceregistry对象传递。 jira票证中有一些解释。
目前,SessionFactory是通过抛出一堆东西构建的 一个配置对象,搅拌它,让它煮沸,然后 然后拔出SessionFactory。严肃地说,有一些 我们目前在配置中运行的方式存在问题 我们如何使用它来构建SessionFactory:
没有"生命周期"各种各样的作品 信息将可用。这是一个重要的遗漏 方式:
1)考虑模式生成。目前我们做不到 甚至在很多db对象名称出现时都知道方言 决心。这将是很好的,因为它将允许我们 透明地处理表/列名称 例如,方言中的关键字/保留字。
2)静态的 类型和类型映射。因为我们目前没有任何东西 哪个适用范围。理想情况下,类型实例会知道 它绑定的SessionFactory。相反,我们现在拥有的是 在很多时候添加API方法来改变 每当发现它时,SessionFactory就作为传递的参数 需要。
3)同样,大多数(全部?)的"静态"组态 Hibernate中的参数目前需要这样,因为 它们在这些静态类型中的使用;因此范围类型会 允许我们也调整这些配置参数的范围(比如 字节码提供者,使用二进制流等)。
理想情况下,我看到的是用户构建的方案 org.hibernate.cfg.Settings(或类似的东西)实例 他们自己。此外,他们将元数据应用于注册表 某种(现在我们称之为MetadataRegistry)。然后为了 构建一个SessionFactory,他们会提供这两个部分 信息(通过ctor?via builder?)。但重要的方面是 直到MetadataRegistry中的信息才会被处理 那个时间点,这将使我们能够保证解决问题 模式对象名称,类型等可以访问运行时 设置(特别是方言)
链接到ticket