Mapping a FunctionalJava Option<Type> with Hibernate

functional-java, functional-programming, hibernate, java

Solution

I would suggest introducing FunctionalJava's `Option` in the accessors (getter and setter), while leaving Hibernate to handle a simple java field which is allowed to be `null`.

For example, for an optional `Integer` field:

// SQL
CREATE TABLE `JKL` (
    `JKL_ID` INTEGER PRIMARY KEY,
    `MY_FIELD` INTEGER DEFAULT NULL
)

You can map a Hibernate private field directly:

// Java
@Column(nullable = true)
private Integer myField;

You could then introduce `Option` at the accessor boundary:

// Java
public fj.data.Option<Integer> getMyField() {
    return fj.data.Option.fromNull(myField);
}

public void setMyField(fj.data.Option<Integer> value) {
    myField = value.toNull();
}

Does that work for your needs?

Problem

I have a hibernate-mapped Java object, `JKL`, which is full of a bunch of normal hibernate-mappable fields (like strings and integers). I'm added a new embedded field to it (which lives in the same table -- not a mapping), `asdf`, which is a `fj.data.Option<ASDF>`. I've made it an option to make it clear that this field may not actually contain anything (as opposed to having to handle `null` every time I access it). How do I set up the mapping in my `JKL.hbm.xml` file? I'd like hibernate to automatically convert a `null` in the database to a `none` of `fj.data.Option<ASDF>` when it retrieves the object. It should also convert a non-null instance of `ASDF` to a `some` of `fj.data.Option<ASDF>`. Is there any other trickery that I have to do?

Original source