hibernate - Hibernate 中的服务注册中心

标签 hibernate

我发现从 Hibernate 4 开始,为了从配置中获取 session 工厂,我们需要使用 ServiceRegistry。

Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);

ServiceRegistry 的用途是什么。为什么需要它?

最佳答案

他们重新设计了 sessionFactory 以将参数作为 Serviceregistry 对象传递。 jira 票证中有一些解释。

Currently a SessionFactory is built by throwing a bunch of stuff into a Configuration object, stirring it, letting it come to a boil, and then pulling out the SessionFactory. In seriousness, there are a few problems with the way we currently operate within a Configuration and how we use it to build a SessionFactory:

The general issue that there is no "lifecycle" to when various pieces of information will be available. This is an important omission in a number of ways:

1) consider schema generation. currently we cannot even know the dialect when a lot of db object names are being determined. this would be nice because it would allow us to transparently handle table/column names which are also keywords/reserved-words in the dialect, for example.

2) static-ness of types and the type-mappings. Because we currently have nothing to which to scope them. Ideally a type instance would be aware of the SessionFactory to which it is bound. Instead, what we have now is to change API methods quite a lot of the time to add in the SessionFactory as a passed parameter whenever it is discovered that it is needed.

3) also, most (all?) of the "static" configuration parameters in Hibernate are currently required to be so because of their use from within these static types; thus scoping types would allow us to also scope those config parameters (things like bytecode-provider, use of binary streams, etc).

Ideally what I see happening is a scheme where users build a org.hibernate.cfg.Settings (or something similiar) instance themselves. Additionally they would apply metadata to a registry of some sort (lets call it MetadataRegistry for now). Then in order to build a SessionFactory, they would supply these two pieces of information (via ctor? via builder?). The important aspect though is that the information in MetadataRegistry would not be dealt with until that point in time, which would allow us to guarentee that resolving schema object names, types, etc would have access to the runtime Settings (and specifically the dialect)

链接到ticket

关于hibernate - Hibernate 中的服务注册中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231345/

相关文章:

java - org.slf4j.impl.StaticLoggerBinder.SINGLETON 错误

java - Hibernate - 编写查询所需的帮助

java - 组织.hibernate.MappingException : No Dialect mapping for JDBC type: 1111

Java Hibernate Projections.sqlGroupProjection 别名

Hibernate 多对多,没有第三张表

java - 连接池 C3P0 日志记录

java - Springboot data-jpa findByDate()

java - 在 spring-mvc 中使用抽象工厂模式时出现空指针异常

java - 监控 Bone cp 连接池

java.lang.RuntimeException : java. lang.reflect.InitationTargetException