hibernate - 使 Hibernate @ManyToOne 关联成为 Scala Option 类型

标签 hibernate scala

有人有一个在 Hibernate 中使用包装对象(例如 Scala 的 Option)来实现 @ManyToOne 关联的示例吗?

谢谢。

编辑: 感谢您的建议。经过进一步思考,我决定使用私有(private)变量,并将它们暴露为具有返回 Option[MyType] 的 scala getter/setter。像这样:

class EmailFolder(__parent: Option[EmailFolder] = None) {

    //.... default constructor etc...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private[this] var _parent: EmailFolder = __parent.orNull
    def parent = Option(_parent)
    def parent_=(newVal:Option[EmailFolder]) = _parent = newVal.orNull
}

这有效,我不再需要在我的应用程序中使用 null。

-- 安德烈亚斯

最佳答案

我最初的想法是创建一个类,将其命名为 Option,将其标记为 @Embeddable,然后为其提供对公共(public)基类的引用您可能想要引用的一组对象(将其称为 DomainObject)。

这样做意味着您可能需要放弃一些东西:

  1. “...任意对象...” 在 Hibernate 中,您不能拥有对完全任意类的 @ManyToOne 引用。它需要是特定的 Hibernate 实体或实体层次结构:即 DomainObject,否则 Hibernate 无法知道在获取时要查询哪些表。
  2. “...空值...” Hibernate 为 Elements 做了一些特殊的事情(又名 @Embeddable)。特别是,如果 Element 仅包含 null 引用,则对 Element 本身的引用为 null。

因此,您可以采用这种方法,但最终会得到一个您可能不想要的基类,以及 Element 类中的一些无关字段,只是为了确保 Element 本身不为 null。有点痛。

相反,我建议您将 Option 类完全保留在 Hibernate 之外。在具有选项的实体中,使用 access type setting这样 Hibernate 通过字段而不是方法来访问成员。像这样实现 getter:

...
@ManyToOne
private MyObjectType myObjectReference;

public Option<MyObjectType> getMyObject() {
    return new Option(this.myObjectReference);
}
...

另一个选择是不进行字段级访问,而是使用 Hibernate 的内部私有(private) getter/setter 来处理字段,以及将其包装在 Option 中的公共(public) getter/setter 供应用程序的其余部分查看.

这里唯一的缺点是 getter 必须做一些实际的工作,而不是一个简单的 POJO 方法。但我认为不让 Hibernate 陷入困境是值得的。

希望有帮助。

关于hibernate - 使 Hibernate @ManyToOne 关联成为 Scala Option 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097430/

相关文章:

java - Hibernate 二级缓存——程序不终止

java - 设置为更新时,Spring Boot mvc java 应用程序无法运行

java - hibernate :未设置方言。设置属性 hibernate.dialect

java - 如何清空Actor死信队列

scala - 如何区分编译器推断的隐式转换和显式调用的隐式转换?

scala - java.lang.NoSuchMethodError 当 rdd.saveAsTextFile 由 spark-shell

scala - 如何从 HList 创建镜头的 HList

json - Spring @ResponseBody 返回 JSON,但缺少键

java - 如何在 jhipster 中创建与额外列的多对多关系?

scala - VS 的子集包含