> I'd be concerned about schema evolution:
Yes, that's the main argument; as said, I can see that.
> I'd see more value in making this the default, and have an "higher
> level" configuration property which is like "read like OGM 5.0 used to
> store it".
I wouldn't like changing such default in a 5.x release. For 6, ok, why not,
if you all think that's better.
> Even better, we'd provide tooling which migrates an existing database.
Sure, migration support is on the roadmap ;)
2016-07-12 11:06 GMT+01:00 Sanne Grinovero <sanne(a)hibernate.org>:
>
> On 12 July 2016 at 10:55, Gunnar Morling <gunnar(a)hibernate.org> wrote:
> > Hi,
> >
> > We had an interesting discussion on how to map element collections of
> > component types with a single column to document stores such as MongoDB.
> >
> > E.g. assume we have
> >
> > @Entity
> > public class Person {
> >
> > public String name;
> >
> > @ElementCollection
> > public List<Status> statusHistory;
> > }
> >
> > @Embeddable
> > public class Status {
> > public String name;
> > }
> >
> >
> > Currently, that's mapped to documents like this:
> >
> > {
> > "name" : "Bob";
> > "statusHistory" : [
> > "great",
> > "mediocre",
> > "splendid"
> > ]
> > }
>
> "great", "mediocre", etc.. are values of the `name` property?
>
> >
> > I.e. if the component type has a single column, we omit the field name
> > in
> > the persistent structure. Whereas if there are multiple columns, it's
> > added
> > so we can properly read back such documents:
> >
> >
> > {
> > "name" : "Bob";
> > "statusHistory" : [
> > { "name" : "great", "date" :
"22.06.2016" },
> > { "name" : "mediocre", "date" :
"15.05.2016" },
> > { "name" : "splendid", "date" :
"12.04.2016" }
> > ]
> > }
> >
> > The question now is, should we also create such array of sub-documents,
> > each containing the field name, in the case where there only is a single
> > column. As far as I remember, the current structure has been chosen for
> > the
> > sake of efficiency but also simplicity (why deal with sub-documents if
> > there only is a single field?).
> >
> > Guillaume is questioning the sanity of that, arguing that mapping this
> > as
> > an element collection of a component type rather than string should
> > mandate
> > the persistent structure to always contain the field name.
>
> I agree, but maybe for other reasons.
> I'd be concerned about schema evolution: if I add a new attribute to
> the `Status` class, say a "long timestampOfChance" for the sake of the
> example,
> as a developer I might want to consider this a nullable value as I'm
> aware that my existing database didn't define this property so far.
>
> I wouldn't be happy to see failures on loading existing stored values
> for Status#name : such mapping choices have to be very consistent.
>
> >
> > We cannot change the default as we are committed to the MongoDB format,
> > but
> > if there is agreement that it's useful, we could add an option to enable
> > this mapping.
>
> So many mapping options :-/
>
> I'd see more value in making this the default, and have an "higher
> level" configuration property which is like "read like OGM 5.0 used to
> store it".
> Even better, we'd provide tooling which migrates an existing database.
>
> >
> > I kind of see how this format simplifies migration (in case another
> > field
> > is added after a while), but personally I still like the more compact
> > looks
> > of the current approach. Having an option for it works for me.
> >
> > Any thoughts?
> >
> > --Gunnar
> > _______________________________________________
> > hibernate-dev mailing list
> > hibernate-dev(a)lists.jboss.org
> >
https://lists.jboss.org/mailman/listinfo/hibernate-dev