[hibernate-dev] Building a SessionFactory
Emmanuel Bernard
emmanuel at hibernate.org
Wed Apr 27 04:29:49 EDT 2011
I've forked your gist adding comments and my own proposal https://gist.github.com/943902
On 27 avr. 2011, at 00:51, Gail Badner wrote:
> I was getting lost trying to follow this email thread, IRC logs, private conversations, and the confusion due to a typo, so I created a gist page (https://gist.github.com/943347).
>
> I've tried to summarizes the alternatives and added a couple of my own. I've also included some open questions that need to be resolved.
>
> I've omitted stuff from when we were confused by the typo.
>
> Maybe it confuses things even more to put info in yet another place (gist), but I was getting so confused, it's at least helped me to get things straight.
>
> ----- Original Message -----
> From: "Steve Ebersole" <steve at hibernate.org>
> To: "Emmanuel Bernard" <emmanuel at hibernate.org>
> Cc: hibernate-dev at lists.jboss.org
> Sent: Tuesday, April 26, 2011 11:47:12 AM
> Subject: Re: [hibernate-dev] Building a SessionFactory
>
> John just pointed out a type here that caused everyone some confusion.
> I apologize.
>
> MetadataSources sources = new MetadataSources(...)
> ...
> .getMetadataBuilder()
> .setNamingStrategy( ... )
> .buildMetadata();
>
> should really read:
>
> Metadata metadata = new MetadataSources(...)
> ...
> .getMetadataBuilder()
> .setNamingStrategy( ... )
> .buildMetadata();
>
>
> On 04/26/2011 11:43 AM, Steve Ebersole wrote:
>> Builder is a generic term. The specific function served here is that of
>> a set of sources for metadata.
>>
>> The same does not hold for ServiceRegistryBuilder. It does not hold a
>> singular type of information. In fact initially I shied away from the
>> name ServiceRegistryBuilder because of its genericness. But in the end
>> decided to use it because it would be familiar to developers.
>>
>> On 04/26/2011 11:05 AM, Emmanuel Bernard wrote:
>>> I think we can converge by using the following approach.
>>> https://gist.github.com/942450
>>>
>>> Check the meeting logs, we have discussed the idea further.
>>>
>>> BTW it occurred to me that MetadataSources is more a builder than
>>> anything else, should it be renamed to align with the service registry
>>> approach?
>>>
>>> On 22 avr. 2011, at 20:43, Steve Ebersole wrote:
>>>
>>>> I do not disagree, especially about the clutter. I had two related
>>>> concerns with that this approach though:
>>>> 1) minor, but this thing is then no longer just collecting the
>>>> sources of metadata which is what a MetadataSources is.
>>>> 2) this is no longer a "directed API" at all. What do I mean by that?
>>>> Well:
>>>>
>>>> MetadataSources sources = new MetadataSources(...);
>>>> sources.setNamingStrategy( strategy1 );
>>>> sources.addResource( "some/resource.xml" );
>>>> sources.setNamingStrategy( strategy2 );
>>>> sources.addResource( "some/resource2.xml" );
>>>>
>>>> We are not "directing" the users to the correct usage of the API by
>>>> the design of the API itself.
>>>>
>>>>
>>>> Here is another option:
>>>> MetadataSources sources = new MetadataSources(...)
>>>> ...
>>>> .getMetadataBuilder()
>>>> .setNamingStrategy( ... )
>>>> .buildMetadata();
>>>>
>>>> Now the naming strategy is associated with this "metadata builder"
>>>> which is more semantically correct. But this is a bit verbose for
>>>> today since I can only think of naming strategy as falling into this
>>>> bucket.
>>>>
>>>>
>>>> On 04/22/2011 03:37 AM, Emmanuel Bernard wrote:
>>>>> My preference would go to a MetadataSources#setMetadata(NamingStrategy)
>>>>>
>>>>> My fear is that more functions could be needed overtime and make the
>>>>> constructor or the buildMetadata signature cluttered and less readable.
>>>>>
>>>>>
>>>>> On 21 avr. 2011, at 15:08, Steve Ebersole wrote:
>>>>>
>>>>>> NamingStrategy is not a service. It is solely a function of
>>>>>> building the metadata.
>>>>>>
>>>>>> Currently, again, I have this set up via ctor param passing:
>>>>>>
>>>>>> new MetadataSources( reg, new MyNamingStrategy() )
>>>>>>
>>>>>> Really its not logically part of the source, its needed during the
>>>>>> transition from source->metadata, so an alternative I have been
>>>>>> contemplating is:
>>>>>>
>>>>>> new MetadataSources( reg ).buildMetadata( new MyNamingStrategy() )
>>>>>>
>>>>>> I am open to other suggestions. I really am trying to keep in mind
>>>>>> the scope in which stuff is needed/useful/valid.
>>>>>>
>>>>>>
>>>>>> On 04/21/2011 03:11 AM, Emmanuel Bernard wrote:
>>>>>>>
>>>>>>> On 21 avr. 2011, at 05:43, Steve Ebersole wrote:
>>>>>>>
>>>>>>>> I think this new API for creating a SessionFactory is starting to
>>>>>>>> firm
>>>>>>>> up, so I wanted to put out another call for feedback before we
>>>>>>>> get too
>>>>>>>> close to Alpha3. So at a high level there are 2 pieces of
>>>>>>>> information
>>>>>>>> needed to build the SessionFactory: the ServiceRegistry and the
>>>>>>>> Metadata.
>>>>>>>>
>>>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>
>>>>>>>> The ServiceRegistry is built through a ServiceRegistryBuilder
>>>>>>>> (this is a
>>>>>>>> slight recent change)
>>>>>>>>
>>>>>>>> Map config = ...;
>>>>>>>> ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(
>>>>>>>> config )
>>>>>>>> ...
>>>>>>>> .buildServiceRegistry();
>>>>>>>>
>>>>>>>> The "..." allows you to add service instances and service
>>>>>>>> initiators.
>>>>>>>> Currently any (map of) configuration values is passed in the
>>>>>>>> constructor. I can be convinced to allow adding/setting of config
>>>>>>>> values as well, if everyone has a preference for that approach:
>>>>>>>>
>>>>>>>> Map config = ...;
>>>>>>>> ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
>>>>>>>> .setConfigurationData( config )
>>>>>>>> .setOption( Environment.SHOW_SQL,
>>>>>>>> true )
>>>>>>>> ...
>>>>>>>> .buildServiceRegistry();
>>>>>>>>
>>>>>>>> Not sure the best method names there, to be honest which is why I
>>>>>>>> opted
>>>>>>>> for passing them to ctor.
>>>>>>>
>>>>>>> Is that a Map<Object,Object> or something a bit more refined?
>>>>>>>
>>>>>>> Regardless of the map being passed to the ctor, I'd think you need
>>>>>>> to ability to set additional options (like you setOptions)
>>>>>>>
>>>>>>> Alternative names:
>>>>>>> option: setting
>>>>>>>
>>>>>>> Not really related but, now that Configuration is gone, we lose
>>>>>>> some of the type safety (like cfg.setNamingStrategy(new
>>>>>>> MyNamingStrategy() ), or am I forgetting something in how the
>>>>>>> service registry works?
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>
>>>>>>>> Metadata is built through a MetadataSources which represents the
>>>>>>>> sources
>>>>>>>> of metadata information.
>>>>>>>>
>>>>>>>> MetadataSources metadataSources = new MetadataSources(
>>>>>>>> serviceRegistry )
>>>>>>>> .addResource( "some.hbm.xml" )
>>>>>>>> .addAnnotatedClass( SomeEntity.class );
>>>>>>>> Metadata metadata = metadataSources.buildMetadata();
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>
>>>>>>>> The Metadata is then used to obtain a SessionFactory.
>>>>>>>>
>>>>>>>> SessionFactory sf = metadata.buildSessionFactory();
>>>>>>>>
>>>>>>>>
>>>>>>>> Metadata represents the "configuration time" mapping information.
>>>>>>>> As of
>>>>>>>> now we will allow users to manipulate and otherwise access this
>>>>>>>> information, hence the seeming "intermediate step". These all
>>>>>>>> work with
>>>>>>>> chaining:
>>>>>>>>
>>>>>>>> SessionFactory sf = new MetadataSources( serviceRegistry )
>>>>>>>> .addResource( "some.hbm.xml" )
>>>>>>>> .addAnnotatedClass( SomeEntity.class )
>>>>>>>> .buildMetadata()
>>>>>>>> .buildSessionFactory();
>>>>>>>>
>>>>>>>
>>>>>>> I guess you could have a buildMetadataSources() hosted on
>>>>>>> ServiceRegistry if you want people to use chaining methods all the
>>>>>>> way.
>>>>>>
>>>>>> --
>>>>>> Steve Ebersole<steve at hibernate.org>
>>>>>> http://hibernate.org
>>>>>
>>>>
>>>> --
>>>> Steve Ebersole<steve at hibernate.org>
>>>> http://hibernate.org
>>>
>>
>
> --
> Steve Ebersole <steve at hibernate.org>
> http://hibernate.org
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
More information about the hibernate-dev
mailing list