[hibernate-dev] [OGM] Mapping of embedded

2016-07-13 Thread Guillaume Smet
Hi,

This is a followup of:
___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev


Re: [hibernate-dev] [OGM] Mapping of embedded

2016-07-13 Thread Guillaume Smet
So this is a followup of my previous email (looks like I found out the
Send shortcut on GMail...)... which was supposed to be a followup of:
 * https://hibernate.atlassian.net/browse/OGM-893
 * https://github.com/hibernate/hibernate-ogm/pull/728
 * and a discussion we had yesterday with Davide.

Taking MongoDB as the reference implementation here.

Current situation
=

1/ for a simple embedded Address (property: homeAddress) with one of
the property having a @Column(name = "postal_code"), we end up with
the following mapping:
{
[...],
'homeAddress' : {
'city' : 'Paris',
'country' : 'France',
'street1' : '1 avenue des Champs Elysees',
'type' : {
'name' : 'main'
}
},
'postal_code' : '75007',
[...]
}
As you can see, postal_code is stored outside of the nested structure.
This is in line with the ORM behavior where you end up having the
columns homeAddress_city and postal_code.

Of course, this is a bit weird when we are considering nested documents.

See EmbeddableMappingTest for reference.

2/ now suppose that we have a List, the current mapping is
the following:
{
[...],
"addresses": [
   {
   "addresses": {
   "country": "Germany",
   "city": "Paris",
   "street1": "1 avenue des Champs Elysees"
   },
"postal_code": "75007"
   },
   {
   "addresses": {
   "city": "Rome",
   "street1": "Piazza del Colosseo, 1",
   "type": {
   "name": "primary"
   }
   },
"postal_code": "00184"
   }
],
[...]
}

Note the fact that addresses is nested twice.

This is discussed at length in https://hibernate.atlassian.net/browse/OGM-893.

What does PR 728 change?


After the work we did with Steve on ORM and the followup of Davide on
OGM, we end up with the following situation:

1/ Same as before. postal_code is outside of the nested document.

2/ This is where the behavior has changed, we now have the following mapping:
{
"addresses": [
   {
   "country": "Germany",
   "city": "Paris",
   "street1": "1 avenue des Champs Elysees",
   "postal_code": "75007"
   },
   {
   "city": "Rome",
   "street1": "Piazza del Colosseo, 1",
   "type": {
   "name": "primary"
   },
   "postal_code": "00184"
   }
],
}

Note that postal_code and city are now at the same level.

See this future test executed on top of pr/728:
https://gist.github.com/gsmet/0652294523b2c48efe72668ccc0a6e1c

Conclusion
==

So as you can see, the mapping is quite different between a simple
embedded and a list of embedded. I was not very happy with the
behavior of 2/ before, especially because if you remove the @Column,
you lose the data stored. Same if you didn't have one before and you
add one to your embeddable.

But I'm also not convinced having a different behavior between 1/ and
2/ is the way to go. Note that, from what I've seen, I don't think
changing 1/ to move postal_code in the nested document will be easy
(or even feasible).

Opinions? Thoughts?

-- 
Guillaume
___
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev