|
From: Colin S. <col...@ex...> - 2003-08-01 18:58:15
|
I was discussing this option with somebody the other day. You actually don't necessarilly need to hit the db for each new object id. You could use the standard hi-lo or variation of technique, where a sequence provides the low word and then the high word comes from in memory, from some sort of singleton. So you end up hitting the db on only every 100 ids, etc. Of course, this does mean that there are all sorts of holes in your ids, and large values. As you say, there is the disadvantage that a tier that is disconnected from the db can no longer use this technique (although potentially that tier could ask for a bunch of ids from the remote tier). The other disadvantage for Hibernate use would be that you would no longer have a distinguising unsaved entity id value, since there would be a valid id in the entity. The only way I can think to get around this and still use saveOrUpdate, is to use a Hibernate Interceptor, and use another property in the entity which says whether it is saved or not. I already use this for an entity with a composite id key, so it's a workable solution. Timo Verhoeven wrote: >Hi! > >I think I know another safe solution... which has its own drawbacks, of >course: > >Given I want to use native db sequences and I use DAOs in my app-design, >I could disallow access to all domain objects' (objects to be >persisted) constructors and insert a 'newInstance' method for each >domain object in a/the DAO. This 'newInstance' method would call the >constructor, then access the native db sequence for the next value, >change the id in the newly created instance, and return that instance. >As far as I see it, this should "do it". > >Drawbacks: >- You can no longer create new domain object instances easily outside >your app (/appserver), say in a remote Client accessing your EJB-app. >- Each and every domain object instance now needs one additional db >access at instantiation time. >- There will be "holes" in your database tables when you look at the id >sequences when you create a domain object instance that will be dropped >without persisting it. >- I'm not sure if the special m:n is handled correctly.... >- Using autoincrement columns with this approach might not be as easy as >using sequences. > >Have I missed something? Opinions? > > >Regards, > >Timo > >Am Freitag, 1. August 2003 19:51 schrieb Colin Sampaleanu: > > >>I started a thread on there actually, but unfortunately I couldn't >>get Gavin to agree that it is worth enhancing Hibernate to support >>dynamic rehashing of the changed element in the Set on the id change, >>which I think is what is really needed... >> >>http://sourceforge.net/forum/forum.php?thread_id=909482&forum_id=1286 >>38 >> >>Timo Verhoeven wrote: >> >> >>>Hi! >>> >>>It might be a good idea to discuss these issues on the hibernate >>>forums/mailing lists. I could imagine, there are others who had >>>these problems before. >>> >>> >>>Regards, >>> >>>Timo >>> >>>Am Dienstag, 29. Juli 2003 17:18 schrieb Colin Sampaleanu: >>> >>> >>>>jürgen höller [werk3AT] wrote: >>>> >>>> >>>>><quote> >>>>>So, we make a hashCode with some smarts. First time hashcode is >>>>>called, - if id is null/zero, then hashCode will forever return >>>>>the same value, which is the same for all class instances. >>>>>Inefficient, but doesn't cause Sets to barf. >>>>>- but if is not-null/zero and hashCode has never been called while >>>>>id was null/zero, then hashCode will retun a value based on the >>>>>id. This means that loaded entities loaded form the db are >>>>>treated efficiently. >>>>> >>>>>Still not that great in terms of efficiency for new entities, but >>>>>efficient for old entities. >>>>></quote> >>>>> >>>>>Interesting idea - a hashCode implementation that tracks if it has >>>>>already been called with an empty ID... So "contains" and "remove" >>>>>will work even after saving, but unfortunately only for this very >>>>>instance. Calling "contains" with a freshly loaded instance (and >>>>>the previously saved one in the collection) will still fail, as >>>>>the freshly loaded instance will return an ID-based hash code >>>>>that will not match the one in the collection. >>>>> >>>>> >>>>Hmm, I think your point shows that this technique is somewhat >>>>dangerous. I think it might break Hibernate's saveOrUpdate >>>>functionality in some cases. You can not have a new object which is >>>>added to a session (therefore it had an empty id and was added as >>>>such to the collection, and then come along with a transient >>>>version of the same object (which was built up in a different >>>>order (ie not added to a collection before the id was set), coming >>>>in as a child in a collection inside a parent object, and call >>>>saveOrUpdate reliably. That is, Hibernate would know if the object >>>>needs to be saved or updated ok, but on an update would not be >>>>able to get the same initial instance to update. >>>> >>>>bummer... >>>> >>>> >>>> >>>>><quote> >>>>>Also, there is still an issue with any collection (ie not HashSet) >>>>>that uses 'equals', since that is going to change when the id >>>>>changes. </quote> >>>>> >>>>>But that doesn't matter as such a collection will just call >>>>>"equals" on *lookup*, not on *addition*. It will always find an >>>>>entity, as long as "equals" can deal with the current state. >>>>>That's not the case with HashSet: The hash code of an object is >>>>>determined within the "add" method, and fixed from there on. >>>>> >>>>>Juergen >>>>> >>>>> >>------------------------------------------------------- >>This SF.Net email sponsored by: Free pre-built ASP.NET sites >>including Data Reports, E-commerce, Portals, and Forums are available >>now. Download today and enter to win an XBOX or Visual Studio .NET. >>http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303 >>_01/01 _______________________________________________ >>Springframework-developer mailing list >>Spr...@li... >>https://lists.sourceforge.net/lists/listinfo/springframework-develope >>r >> >> > > > >------------------------------------------------------- >This SF.Net email sponsored by: Free pre-built ASP.NET sites including >Data Reports, E-commerce, Portals, and Forums are available now. >Download today and enter to win an XBOX or Visual Studio .NET. >http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 >_______________________________________________ >Springframework-developer mailing list >Spr...@li... >https://lists.sourceforge.net/lists/listinfo/springframework-developer > > |