I am pleased to announce the release of Hibernate OGM 4.2.0.CR1.
The new version comes to you with initial support for Apache Cassandra, several improvements around JP-QL queries, support for MongoDB 3, MongoDB replica sets, new built-in types and much more.
You can download Hibernate OGM 4.2.0.CR1 from SourceForge or via Maven, Gradle etc., using the following GAV coordinates:
- org.hibernate.ogm:hibernate-ogm-core:4.2.0.CR1 for the Hibernate OGM engine and
- org.hibernate.ogm:hibernate-ogm-<%DATASTORE%>:4.2.0.CR1, depending on the backend you want to use.
Preview for Apache Cassandra support
Cassandra is a highly performant and scalable datastore of the BigTable family. The request for supporting it dates back to the early days of Hibernate OGM. So it’s a great pleasure to finally have this puppy out. Many thanks to all that worked on this journey: Michaël Figuière, Khanh Maudoux, John Worrell and Jonathan Halliday!
To use the Cassandra backend, add the hibernate-ogm-cassandra module to your classpath and specify the following properties for your persistence unit:
hibernate.ogm.datastore.provider = cassandra_experimental hibernate.ogm.datastore.database = my_keyspace hibernate.ogm.datastore.host = cassandra.example.com
The Cassandra backend is in “tech preview” state at this moment. We still have lots of work left on our plates (e.g. clustering support, alternative association persistence options, queries, documentation), but we think we have the right foundation now. Be warned that mapping details still may change. Still this is the right time for you to give this new backend a first try and let us know about your experiences with it.
Any feature requests, error reports and other feedback are very welcome. Especially any thoughts on the proposed mapping of domain model elements to Cassandra structures are of great interest for us.
Query improvements
We spent some more time to improve support for mapping JP-QL queries either to native NoSQL queries or full-text queries executed via Hibernate Search + Lucene.
You can now use types like enums or Date as query parameters:
List<Movie> movies = entityManager.createQuery( "SELECT m FROM Movie m WHERE m.genre IN (:genre)", Movie.class )
.setParameter( "genre", EnumSet.of( Genre.DRAMA, Genre.COMEDY ) )
.getResultList();
As you would expect it, the given parameter values are converted into the corresponding type used in the datastore and passed to the query engine.
Mapping fix for element collections with nested embeddables
This release fixes a bug related to the mapping of nested embeddables stored within element collections. This affects the supported document stores as well as Neo4j. E.g. consider the following entity model:
@Entity
public class Account {
@ElementCollection
List<Address> addresses;
}
@Embeddable
public class Address {
String street;
String city;
AddressType type;
}
@Embeddable
public class AddressType {
String name;
}
Previously, this would have been stored as follows e.g. in MongoDB:
{ "_id" : "account-1", "addresses" : [ { "street" : "Piazza del Colosseo, 1", "city" : "Rome", "name" : "work" <-- “flattened” representation of the nested embeddable }, ... ] }
Whereas it really should be mapped like this:
{ "_id" : "account-1", "addresses" : [ { "street" : "Piazza del Colosseo, 1", "city" : "Rome", “type” : { "name" : "work" } }, ... ] }
This is the mapping applied as of this new release. Note that you need to take care of existing records should have been working with such a model. Also please check out the migration notes for the details.
We don’t take such mapping changes lightly and try to avoid them as much as we can. As this really was a mapping error, we decided to fix it as soon as possible; in the future we also may provide compatibility options or some sort of migration tooling in similar situations.
Support for MongoDB 3 and MongoDB replica sets
We now also support MongoDB 3. In particular the new SCRAM-SHA-1 authentication strategy is working now. Migration should be smooth.
But the biggest improvement is support for replica sets. To quote MongoDB’s documentation, a replica set “is a group of mongod processes that maintain the same data set”. By using replica sets, your data is stored redundantly and protected against node failures through automatic fail-over between replica set members.
To support the notion of replica sets, Hibernate OGM’s “host” configuration option has been enhanced and now allows to specify a comma-separated list of hosts and host:port tuples:
hibernate.ogm.datastore.host=db1.example.com,db2.example.com,db3.example.com:29019
With this configuration Hibernate OGM would connect to three MongoDB nodes, using the default port 27017 for the nodes db1 and db2 and the explicitly given port 29019 for node db3.
Currently the MongoDB backend is the only one supporting several nodes, but other backends will follow, e.g. Cassandra.
New built-in types for boolean mapping
Requested by a user in our forum, we now support all the boolean mapping types known from Hibernate ORM: YesNoType (maps to character/String “Y” or “N”), TrueFalseType (maps to “T” or “F”) and NumericBooleanType (maps to 1 or 0).
You can use these types by means of the @Type annotation like so:
// maps as boolean; default
private boolean myBoolean;
@Type(type = "true_false")
private boolean myBoolean;
@Type(type = "yes_no")
private boolean myBoolean;
@Type(type = "numeric_boolean")
private boolean myBoolean;
Any feedback to the 4.2.0.CR1 release is highly welcome. The change log tells in detail what's in there for you. Finally, some more useful links: