[hibernate-dev] Re: More fun with merging : non-updatable fields
Josh Moore
josh.moore at gmx.de
Thu Sep 28 02:52:19 EDT 2006
Sorry, Christian, didn't get your emails because of a delayed digest
message. And I agree that it can be seen as reasonable behavior. With
saveOrUpdate (as Emmanuel was pointing out) one gets
* in DB: no change
* in memory: (invalid) change
and with these semantics for merge:
* in DB: no change
* in memory: (invalid) change.
Understood. I think there's a case to be made, however, for not
expending extra time for merge to make the in memory representation
invalid. For me it's a part of what "merge" means : "Take the DB
representation and the in-memory representation and produce something
_new_". I.e. I'm expecting to have to deal with that situation.
SaveOrUpdate differs in that I still have my in-memory object
references, so no one should screw with them. Merge is polar opposite.
I'm given new references and have to, somehow, deal with this new state.
My opinion, which is nothing more than that, is : it'd be nice if those
new object references were valid.
But, *shrug*, whatever. If those aren't desired or generally useful
semantics, I'll finish implementing the logic for my MergeEventListener.
I could use some help getting hold of EmbeddedComponentType's metamodel
(see
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1907). But
I'll catch Max on irc for that. ;)
Thanks again,
Josh.
P.S. one last thing, Christian. You mentioned "Don't [apply those
values] if you don't want [them]", though there's one case where it's
actually "Then do [appply those values] if you want [them]". Namely on
the reverse side of a bidirectional many-to-one. If you call
child.setParent(parent) and not parent.getChildren().add(child), then
you'll get a parent back which still doesn't have children in it. A bit
freaky the first time you experience it. And no, Hibernate doesn't do
CMR, but it also needn't go out of it's way to NOT do CMR. Cheers.
Christian wrote:
>> This is consistent with the way saveOrUpdate works
>
> And it's perfectly reasonable behavior. If I modify a field value,
> then merge, then take the instance returned by merge, I expect that
> the value is still there in the merged result. That has nothing to do
> with the update/UPDATE behavior of Hibernate.
>> copies _invalid_ values on top of the clean proxied collection, and
>> sends that back to the user.
>
> It does so because you applied these values. Don't do that if you
> don't want it. Thanks to Hibernate your mistake will not end up in
> the database.
Max wrote:
> Yes, Josh - consider especially the situation Christian explained that if
> you merge Xy onto a session you expect the returning object is Xy and not
> Xx.
>
> If you want this behavior (which in some cases I can see the usefullness
> of) you need to have
> a custom merge implementation as you already have.
>
> /max
More information about the hibernate-dev
mailing list