Search code examples
javahibernatefunctional-programmingfunctional-java

Mapping a FunctionalJava Option<Type> with Hibernate


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?


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?