Hibernate - Java8函数对象可以保存在数据库中吗?

时间:2017-12-08 13:28:19

标签: java hibernate jpa lambda java-8

我正在开发一个抽象模型来表示基于事件注册的各种复杂业务流程。为此,我希望能够使用最新版本的Hibernate来持久保存Java8 Function对象,例如

@Entity
public class Foo {
    private Runnable onUpdate = () -> System.out.println("worked");
    private java.util.function.Function<String, String> identity = s -> s;
    // imagine bean-compliant getter and setter
}

持久方法引用不是一个选项,因为在设置回调之前运行时的部分方法应用是必需的。

只是尝试上面的代码会导致以下异常:
    org.hibernate.MappingException: Could not determine type for: java.lang.Runnable ...

有没有办法保留与Runnable等固定功能接口匹配的函数对象?如果没有,有哪些替代策略可用?

关于XY问题的编辑:

我希望能够将对象中的方法与一些hibernate实体相关联 在运行时期间PostUpdate callback,同时让用户提供hibernate回调无法提供的所有参数。例如,我有一个实体@Entity public class Bar和另一个带有方法void foo(Bar new, int i)的控制器类。现在,每次在数据库中更新Bar的特定实例时,我希望它使用更新的对象和参数foo来调用i,该参数由用户在当前指定或者将foo-EventBar实例相关联的某个先前运行时。

最重要的是,我想使用Hibernate 持久化这个运行时关联,保持对方法的引用,方法所属的对象以及关联期间提供的所有参数。然后,在服务器启动时,只要加载控制器对象,它就会监听对实体实例所做的更改。

1 个答案:

答案 0 :(得分:2)

没有

不幸的是,在当前版本的Hibernate中,不可能将Java 8函数存储在数据库中。 Lambdas没有实现Serializable,也没有办法让他们这样做。